我试图让一个登录窗口显示为我的 MainWindow 中的工作表,但是每当我尝试实现 AppKit 方法时,由于各种难以区分的原因,总是会弹出一个错误。
那里的在线指南都不起作用,当我将他们的代码/改编类应用到我自己的项目时,它们永远不会起作用。
大多数指南都严重过时,包括 Apple 文档。而且它们似乎都不与自动引用计数兼容。或者 Xcode 4 接口。
有人可以为我详细介绍完整的指南,以便在主窗口上按下按钮后显示工作表的最简单方法。
如果您需要,请随时询问更多信息。
我试图让一个登录窗口显示为我的 MainWindow 中的工作表,但是每当我尝试实现 AppKit 方法时,由于各种难以区分的原因,总是会弹出一个错误。
那里的在线指南都不起作用,当我将他们的代码/改编类应用到我自己的项目时,它们永远不会起作用。
大多数指南都严重过时,包括 Apple 文档。而且它们似乎都不与自动引用计数兼容。或者 Xcode 4 接口。
有人可以为我详细介绍完整的指南,以便在主窗口上按下按钮后显示工作表的最简单方法。
如果您需要,请随时询问更多信息。
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
AppDelegate.m
#import "AppDelegate.h"
@implementation AppDelegate
@synthesize window = _window;
- (IBAction) showTheSheet:(id)sender {
[NSApp beginSheet:theSheet
modalForWindow:(NSWindow *)_window
modalDelegate:self
didEndSelector:nil
contextInfo:nil];
}
-(IBAction)endTheSheet:(id)sender {
[NSApp endSheet:theSheet];
[theSheet orderOut:sender];
}
@end
打开MainMenu.xib
.
使用现有的NSWindow
.
使用以下按钮使其可见:
创建一个新的NSPanel
.
添加适当的NSButtons
.
连接Close
到App Delegate
.
并选择endTheSheet
。
连接Open
到App Delegate
.
并选择showTheSheet
。
连接App Delegate
到新的NSPanel
.
并选择theSheet
。
选择NSPanel
并禁用Visible At Launch
。
(关键步骤!)
现在点击运行并享受结果:
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)endSheet:(NSWindow *)sheetWindow
这会导致上述调用中的 completionHandler 被触发, - 您可以通过调用 NSApp 来调用以停止运行模式窗口:
- (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