我正在尝试将一个登录窗口显示为来自我的MainWindow的工作表,但每当我尝试实现AppKit方法时,总会出现错误,因为各种无法区分的原因。
没有在线指南有效,当我将他们的代码/改编课程应用到我自己的项目时,他们从不工作。
大多数指南都过时了,包括Apple文档。而且它们似乎都与自动参考计数兼容。或Xcode 4接口。
有人能够在完整的指南中为我详细说明,以便在MainWindow按下按钮后显示表单的最简单方法。
如果您需要,请随时提出更多信息。
答案 0 :(得分:93)
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
。
(基本步骤!)
现在点击并享受结果:
答案 1 :(得分:6)
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