不止一次,您真的应该将您的应用程序委托与您的窗口控制器分开。继续并从模板创建一个新的 Cocoa 应用程序。在MainMenu.xib
中,删除窗口。在AppDelegate.h
删除IBOutlet
到NSWindow
. 用s--perhaps和.创建几个新的NSWindowController
complete子类。 XIB
LoginWindowController
TimelineWindowController
对于“最终”NSWindowController
子类(即那些不会被子类化的子类),指定初始化器的最佳实践是
//for our example class LoginWindowController
- (id)init
{
self = [super initWithWindowNibName:@"LoginWindowController"];
if (self) {
//....
}
return self;
}
现在在您的应用程序委托中,您应该拥有@properties
两个不同的窗口控制器实例:
//Within AppDelegate.m
#import "AppDelegate.h"
#import "LoginWindowController.h"
#import "TimelineWindowController.h"
@interface AppDelegate ()
@property (nonatomic) LoginWindowController *loginWindowController;
@property (nonatomic) TimelineWindowController *timelineWindowController;
//For the sake of this demo, add a property for the loggedIn state:
@property (nonatomic) BOOL loggedIn;
@end
你应该在你的应用程序委托中有某种方法来呈现正确的窗口控制器。让我们称之为-updateWindowVisibility
:
- (void)updateWindowVisibility
{
BOOL isLoggedIn = self.loggedIn;
BOOL loginWindowVisible = self.loginWindowController.window.isVisible;
BOOL showLoginWindow = !isLoggedIn;
BOOL timelineWindowVisible = self.timelineWindowController.window.isVisible;
BOOL showTimelineWindow = isLoggedIn;
if (!loginWindowVisible && showLoginWindow) {
if (!self.loginWindowController) self.loginWindowController = [[LoginWindowController alloc] init];
[self.loginWindowController showWindow:nil];
} else if (loginWindowVisible && !showLoginWindow) {
[self.loginWindowController close];
self.loginWindowController = nil;
}
if (!timelineWindowVisible && showTimelineWindow) {
if (!self.timelineWindowController) self.timelineWindowController = [[TimelineWindowController alloc] init];
[self.timelineWindowController showWindow:nil];
} else if (timelineWindowVisible && !showTimelineWindow) {
[self.timelineWindowController close];
self.timelineWindowController = nil;
}
}
上面实现的这种方法比当前设置所需的工作要多一点,但是当您需要显示/隐藏其他窗口时应该更容易修改。此时剩下要做的就是调用-updateWindowVisibility
from -applicationDidFinishLaunching:
。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
self.isLoggedIn = NO;
[self updateWindowVisibility];
}
我已经在github上发布了一个示例应用程序来演示这种方法。