在NSBox中重新加载视图时出现问题

时间:2013-06-05 19:09:20

标签: macos nswindowcontroller nsviewcontroller nsbox

重新加载视图时遇到问题。 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,但是无济于事。

任何想法,建议,通知都无法正常工作,但可能无法正确设置。

由于

1 个答案:

答案 0 :(得分:0)

看起来你把视图加载与显示混淆了。仅在加载nib文件时,nib文件对象才会收到-awakeFromNib。同样,只有在加载了相应的nib文件时,视图控制器才会收到-loadView。由于您将视图控制器保留在一个数组中,因此这些视图控制器不会被释放,因此在数组处于活动状态时,它们的相应nib文件永远不会被卸载。这是合理的行为,但是您必须记住-awakeFromNib-loadView在这种情况下只执行一次因为nib加载只执行一次。

由于您似乎在-loadView手动填充视图,因此每当您将该视图设置为框的内容视图时,您也必须这样做(假设您不是每次都在更新视图时模型变化)。例如,您可以在视图控制器中使用-reloadData方法,-loadView和方框内容视图交换方法都使用-reloadData

或者,您可以将模型对象设置为视图控制器的表示对象,并将相应视图中的控件绑定到该表示对象的属性。 NSViewController公开了一个方便绑定的representedObject属性。

对于记录,-[NSBox setContentView:]标记了重新显示的框,因此您无需发送-setNeedsDisplay:YES

(并确保_box实际指向NSBox实例)