【问题标题】:Issues when reloading views in an NSBox在 NSBox 中重新加载视图时的问题
【发布时间】:2013-06-05 19:09:19
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: macos nswindowcontroller nsviewcontroller nsbox


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回复。但是,我的尝试之一是使用 -loadView 调用方法来更新控件。由于 -loadView 仅在初始加载而不是后续显示时调用,因此没有乐趣。我会继续试验。
    • @MichaelWay 我的回答是,您必须调用一个方法来更新控件无论何时替换内容视图(或每当您更新模型时),因为@987654335 @ 还不够。
    • 原来是一个简单的修复。在 NSWindowController、showPane 方法中,我发送了一个通知。在每个 viewController 中,当收到通知时,调用 viewIsVisible: 调用所需的更新方法。现在我可以继续了。事实上,更新方法是之前无法调用的方法
    猜你喜欢
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多