使用ARC在Xcode 4(OSX 10.7.2)中将Cocoa窗口显示为工作表
我试图让登录窗口从主窗口显示为工作表,但每当我尝试实现AppKit方法时,总会因为各种无法区分的原因弹出一个错误 那里的在线指南都不起作用,当我将它们的代码/修改类应用到我自己的项目中时,它们就不起作用了 大多数指南已经严重过时,包括苹果的文档。它们似乎都与自动引用计数不兼容。或者Xcode 4接口 有人能为我详细介绍一个完整的指南,为最简单的方式显示一张表后,按下主窗口上的按钮使用ARC在Xcode 4(OSX 10.7.2)中将Cocoa窗口显示为工作表,cocoa,osx-lion,xcode4.2,automatic-ref-counting,cocoa-sheet,Cocoa,Osx Lion,Xcode4.2,Automatic Ref Counting,Cocoa Sheet,我试图让登录窗口从主窗口显示为工作表,但每当我尝试实现AppKit方法时,总会因为各种无法区分的原因弹出一个错误 那里的在线指南都不起作用,当我将它们的代码/修改类应用到我自己的项目中时,它们就不起作用了 大多数指南已经严重过时,包括苹果的文档。它们似乎都与自动引用计数不兼容。或者Xcode 4接口 有人能为我详细介绍一个完整的指南,为最简单的方式显示一张表后,按下主窗口上的按钮 如果需要,请随时询问更多信息。Xcode 4教程 创建新项目并将以下内容添加到AppDelegate.h和AppDe
如果需要,请随时询问更多信息。Xcode 4教程 创建新项目并将以下内容添加到
AppDelegate.h
和AppDelegate.m
AppDelegate.h
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate> {
IBOutlet NSPanel *theSheet;
}
@property (assign) IBOutlet NSWindow *window;
@end
打开main菜单。xib
使用现有的
NSWindow
使用以下按钮使其可见: 创建一个新的
NSPanel
添加相应的
按钮
将关闭
连接到应用程序代理
然后选择结束纸张
将打开
连接到应用程序代理
然后选择显示工作表
将应用程序代理连接到新的NSPanel
然后选择图纸
选择NSPanel
并禁用启动时可见的。
(关键步骤!)
现在点击run并享受结果:
SDK 10.10中的情况发生了变化-我认为调用更容易理解。父窗口负责以工作表的形式启动子NSWindow,然后将该子NSWindow传递给NSApp以进行模式运行。然后按相反的方法展开
显示工作表
要显示工作表而不是调用,请执行以下操作:
[NSApp beginSheet:theSheet
modalForWindow:(NSWindow *)_window
modalDelegate:self
didEndSelector:nil
contextInfo:nil];
现在可以调用父窗口:
(void)beginSheet:(NSWindow *)sheetWindow
completionHandler:(void (^)(NSModalResponse returnCode))handler
然后,要以模态循环的方式运行工作表,还必须使用以下命令调用NSApp:
- (NSInteger)runModalForWindow:(NSWindow *)aWindow
- (void)stopModalWithCode:(NSInteger)returnCode
结算单
要关闭图纸,请调用父窗口:
- (void)endSheet:(NSWindow *)sheetWindow
这会导致上述调用中的completionHandler被激发,-在该调用中,您可以通过以下方式调用NSApp停止运行模式窗口:
- (NSInteger)runModalForWindow:(NSWindow *)aWindow
- (void)stopModalWithCode:(NSInteger)returnCode
完整示例
@implementation AppDelegate
@synthesize window = _window;
- (IBAction) showTheSheet:(id)sender {
[_window beginSheet: theSheet
completionHandler:^(NSModalResponse returnCode) {
[NSApp stopModalWithCode: returnCode];
}];
[NSApp runModalForWindow: theSheet];
}
-(IBAction)endTheSheet:(id)sender {
[_window endSheet: theSheet];
}
@end
你真是太棒了!这些截图真的很好,也很有帮助,非常感谢。在上面的示例中向Anne提问:如果我要在工作表中添加一个NSTextField,我如何在工作表和其父窗口之间来回传输文本?@Woofy,你找到了解决方案吗?谢谢你的屏幕截图让我想起了一位绝地大师的作品。谢谢:)你今天是我的英雄!非常感谢:DIf不应该出现在这里(因为标题是针对xcode 4的,请在向下投票之前通知我,我将删除它),需要说明的是,在调用beginSheet之前必须隐藏“工作表”窗口,否则它看起来像一张工作表,但没有附加。