0

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

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

谢谢

4

1 回答 1

0

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

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

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

作为记录,-[NSBox setContentView:]将框标记为重新显示,因此您不需要发送它-setNeedsDisplay:YES

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

于 2013-06-06T11:10:41.073 回答