重新加载视图时遇到问题。 OSX并不像IOS那么简单。
在MainMenu.xib中我有一个NSBox。根据Hillegrath,几个视图存储在一个数组中,当按下一个分段按钮时,会显示视图。这工作正常。我的沮丧包括在进行更改后重新审视这些视图,这些视图应该使他们通过 [self someAction] 重新显示新值。两个视图中的操作会改变(全局)值,这些值应传播其他视图中的更改。我正在使用带有xib(MainMenu)的窗口控制器来保存包含视图的框。我还在代码中标题了视图。
全局ivar值在需要时正确更改,日志显示。但是,重新访问视图时不会发生相关操作,即更新视图细节。
出现的情况是,在显示各种视图时不会调用loadView,** **。 awakeFromNib和loadView在首次显示每个视图时正常运行,但在重新显示时却没有。这意味着视图可能被隐藏但viewDidUnhide无效。
视图更改代码(来自SO MVC答案和Hillegrath)是
NSViewController *activeVC =
(NSViewController *) self.viewControllers[index];
// [_box setContentView:nil];
[_box setContentView:activeVC.view];
[_box setNeedsDisplay:YES];
从复制的代码可以看出,在设置新视图之前,我还尝试将活动内容设置为nil,但是无济于事。
任何想法,建议,通知都无法正常工作,但可能无法正确设置。
由于
答案 0 :(得分:0)
看起来你把视图加载与显示混淆了。仅在加载nib文件时,nib文件对象才会收到-awakeFromNib
。同样,只有在加载了相应的nib文件时,视图控制器才会收到-loadView
。由于您将视图控制器保留在一个数组中,因此这些视图控制器不会被释放,因此在数组处于活动状态时,它们的相应nib文件永远不会被卸载。这是合理的行为,但是您必须记住-awakeFromNib
和-loadView
在这种情况下只执行一次因为nib加载只执行一次。
由于您似乎在-loadView
手动填充视图,因此每当您将该视图设置为框的内容视图时,您也必须这样做(假设您不是每次都在更新视图时模型变化)。例如,您可以在视图控制器中使用-reloadData
方法,-loadView
和方框内容视图交换方法都使用-reloadData
。
或者,您可以将模型对象设置为视图控制器的表示对象,并将相应视图中的控件绑定到该表示对象的属性。 NSViewController
公开了一个方便绑定的representedObject
属性。
对于记录,-[NSBox setContentView:]
标记了重新显示的框,因此您无需发送-setNeedsDisplay:YES
。
(并确保_box
实际指向NSBox
实例)