【发布时间】:2015-03-21 03:43:35
【问题描述】:
我正在开发一个应用程序,它是单个 NSWindow,单击窗口内的按钮将显示 NSViewController,并且该控制器中存在一个按钮,将显示不同的 NSViewController。我知道如何换出窗口中的视图,但我在尝试使用多个视图控制器时遇到了问题。我已经解决了这个问题,但我认为我没有以适当的方式完成此行为。
我原来在AppDelegate中定义了一个方法:
- (void)displayViewcontroller:(NSViewController *)viewController {
BOOL ended = [self.window makeFirstResponder:self.window];
if (!ended) {
NSBeep();
return;
}
[self.box setContentView:viewController.view];
}
我为 AppDelegate 的 NSButton 设置了一个目标/操作,在这里我调用该方法来显示一个新的视图控制器:
- (IBAction)didTapContinue:(NSButton *)sender {
NewViewController *newVC = [[NewViewController alloc] init];
[self displayViewcontroller:newVC];
}
这确实有效 - 它呈现了新视图控制器的视图。但是,如果我随后单击该视图中具有位于其视图控制器类中的目标/操作设置的任何按钮,应用程序会立即崩溃。
要解决此问题,我必须将didTapContinue: 更改为以下内容:
- (IBAction)didTapContinue:(NSButton *)sender {
NewViewController *newVC = [[NewViewController alloc] init];
[self.viewControllers addObject:newVC];
[self displayViewcontroller:[self.viewControllers lastObject]];
}
首先,您能解释一下为什么这样可以解决问题吗?似乎与控制器在内存中“保持”的方式有关,但我并不肯定。
我的问题是,如何设置它以便可以从任何视图控制器中换出视图?我正计划获取对 AppDelegate 的引用并使用我刚刚在该类中实例化的新控制器调用displayViewcontroller:,但这会导致崩溃。我需要先将它存储在数组中,然后将该引用发送到方法中。这是一种有效的方法 - 将 viewControllers 数组公开,然后使用 lastObject 调用该方法,或者应该如何设置?
【问题讨论】:
-
快速提问。你在小牛队还是优胜美地工作?
-
@MacUserT Yosemite :)
标签: objective-c macos cocoa appdelegate nsviewcontroller