2011-08-24 35 views
0

我有一個簡單的應用程序,而不是基於文檔。我想有一個登錄窗口,允許用戶登錄或添加一個用戶,並且當他們登錄成功時,我想讓它加載主頁面。如果從主頁面單擊註銷,它應該銷燬主頁面並將您帶回登錄頁面。 聽起來像一個簡單的計劃,但由於某種原因,我有一個問題。Multiwindows問題,可可

我把它現在的樣子,我檢查,如果用戶登錄或沒有在主文件中的AppDelegate並加載不同的窗口控制器。當客戶登錄時,我從Login Conntroller發回一個通知給AppDelegate,併爲主窗口加載另一個窗口控制器。

事情是這樣的:

if([[settings get:@"isLoggedIn"] isEqualToString:@"Yes"]) 
{ 
    MainController *tmpMainController = [[MainController alloc] initWithWindowNibName:@"MainWindow"]; 
    self.mainController = tmpMainController; 
    NSWindow *mainWindow = [tmpMainController window]; 
    [mainWindow makeKeyAndOrderFront:self]; 
    [tmpMainController release]; 

} else { 
    LoginController *tmpViewController = [[LoginController alloc] initWithWindowNibName:@"LoginWindow"]; 
    self.loginController = tmpViewController; 
    loginWindow = [tmpViewController window]; 
    [loginWindow makeKeyAndOrderFront:self]; 
    [tmpViewController release]; 
} 

一切正常,它會顯示正確的窗口。但是當我從主頁面註銷時,奇怪的部分發生,再次登錄並再次註銷。如果我多次執行此操作,而不是向我顯示1個登錄窗口,則會顯示2.如果我繼續登錄過程,則在第二次嘗試時會顯示2個主窗口。如果我再次註銷,我會看到4個級聯登錄窗口,然後我看到5或7個主窗口。在所有的窗口被加載後,所有額外的窗口開始逐一被破壞。它看起來像是當新窗口被創建時,它繪製所有舊窗口,然後是新窗口,然後銷燬所有舊窗口。我不知道爲什麼會發生。想要一些幫助。

這裏是我的主控制器的代碼時,客戶點擊註銷:

-(IBAction)logOutClick:(id) sender 
{ 
    [settings set:@"isLoggedIn" value:@"No"]; 
    [[self window] orderOut:self]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"NSUserLoggedOutNotification" object: self userInfo: nil]; 
} 

爲登錄控制器同樣的事情:

if ([users verifyUser]) { 
     [settings set:@"isLoggedIn" value:@"Yes"]; 
     [loginView removeFromSuperview]; 
     [[self window] orderOut:self]; 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"NSUserLoggedInNotification" object: self userInfo: nil]; 
    } 

我已經「關閉時被釋放」兩個勾掉視窗。

回答

0

我每次註銷時都添加了新的nsnotification中心觀察者。
這是問題所在。