2011-08-24 44 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中心观察者。
这是问题所在。