1回限りの場合は、アプリデリゲートをウィンドウコントローラーから分離する必要があります。先に進み、テンプレートから新しいCocoaアプリケーションを作成します。でMainMenu.xib
、ウィンドウを削除します。AppDelegate.h
を削除IBOutlet
しNSWindow
ます。s(おそらくと)をNSWindowController
含む完全ないくつかの新しいサブクラスを作成します。 XIB
LoginWindowController
TimelineWindowController
「最終的な」NSWindowController
サブクラス(つまり、サブクラス化されないサブクラス)の場合、指定された初期化子のベストプラクティスは次のとおりです。
//for our example class LoginWindowController
- (id)init
{
self = [super initWithWindowNibName:@"LoginWindowController"];
if (self) {
//....
}
return self;
}
これで、アプリデリゲートに@properties
、2つの異なるウィンドウコントローラーインスタンスが必要になります。
//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
です-applicationDidFinishLaunching:
。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
self.isLoggedIn = NO;
[self updateWindowVisibility];
}
このアプローチを示すサンプルアプリをgithubに投稿しました。