【发布时间】:2011-08-27 20:51:48
【问题描述】:
我有一个简单的应用程序,不是基于文档的。我想要一个允许人们登录或添加用户的登录窗口,当他们成功登录时,我希望它加载主页。如果从主页单击注销,它应该会破坏主页并带您回到登录页面。 听起来像一个简单的计划,但由于某种原因我遇到了问题。
按照我现在的方式,我在主文件 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];
}
我为两个窗口都选中了“关闭时释放”。
【问题讨论】: