【问题标题】:Is there a better way to access the Document from its subviews?有没有更好的方法从其子视图访问文档?
【发布时间】:2011-11-03 21:38:57
【问题描述】:

我的文档中有一些类,例如 NSNotificationCenter 和 NSUndoManager,我需要从我的子视图中访问它们。

现在我可以通过执行以下操作来访问它们:

NSUndoManager *undoManager = [[[[[self view] window] windowController] document] undoManager];

有没有更好的方法我不知道?谢谢。

【问题讨论】:

    标签: objective-c cocoa nsdocument nsundomanager document-based


    【解决方案1】:

    为什么视图需要担心撤消管理器?似乎那里可能需要进行一些重构。

    通常,视图可能会在第一响应者中触发某些操作。然后,该操作将向上传递到响应者链,直到找到响应该操作的对象,例如窗口控制器或文档。 “撤消”事件通常会影响数据模型,因此文档会处理类似的事情。当用户撤消之前的操作时,模型会恢复到之前的状态,并且视图层次结构会反映更改。

    在您的情况下,是否可以将处理撤消管理器的责任转移到文档上?

    这同样适用于通知中心。如果文档有通知中心,为什么视图试图使用它?您可以利用上述响应者链向文档发送消息吗?如果更合适,您还可以使用+defaultNotificationCenter 获得默认通知中心。

    【讨论】:

    • 同意:在绝大多数情况下,文档类和其他模型类应该负责告诉撤消管理器有关撤消/重做操作的信息。
    • 我希望我的文档的子视图接收仅与它们相关的通知。如果子视图使用 defaultNotificationCenter,它将接收来自其他文档的通知。我在想的是,除了文档之外,会有相当于应用程序委托的东西。您说得对,但可能需要进行重构。
    • 视图通常不太关心其他视图,除了定位和绘制子视图以及诸如此类的事情。向响应者链发送消息并忘记它。如果有一些需要做的通知,让文档或窗口控制器发布通知。当视图依赖于其他视图的内容或行为时,移动视图突然变得非常困难。
    • 谢谢,我看看我能做什么。
    猜你喜欢
    • 2020-11-14
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    相关资源
    最近更新 更多