【问题标题】:Cocoa-Binding : Submit changes manually?Cocoa-Binding:手动提交更改?
【发布时间】:2010-04-22 05:45:49
【问题描述】:

在我的应用程序中,我有一个绑定到 ArrayController (arrangedObjects) 的 NSTableView。我还有一个绑定到同一个控制器(选择)的详细信息视图(只是一些文本字段)。

现在,每次我编辑文本字段时,更改都会自动发送到 ArrayController 并且表格也会更改。我怎样才能避免这种情况?我想要的是一个“提交按钮”。数据的更改应该只在我按下按钮时发送到控制器,而不是在每次我进行编辑时自动发送。

【问题讨论】:

    标签: cocoa cocoa-bindings


    【解决方案1】:

    这个问题实际上有两个答案。第一个更具哲学性:在大多数情况下,您希望模型的更新立即发生。在大多数情况下,用户不必为保存、提交等更改制作而烦恼。 Binding 与NSUndoManager 的广泛集成意味着用户所做的任何事情都可以撤消(或应该是可撤消的)。所有用户操作都应该是“低风险”的,这样进行更改然后撤消不会对用户数据或应用程序状态造成不必要的“伤害”。如果您将 Core Data 用于模型层,则始终可以使用 NSManagedObjectContext 的方法以编程方式回滚或保存一组更改。除非有一个真的很好的理由说明用户需要“提交”按钮,否则不要放入。与此理念相符的是 Gmail 的“撤消发送”功能。即使发送电子邮件也应该是可撤销的(在合理范围内)。

    第二个答案更实用。当然,在某些情况下,您正在处理的后端系统不像 Cocoa 那样容忍撤消。在这种情况下,最好的选择是创建一个临时模型对象作为 UI 的模型(想想 Model-View-View-Model (MVVM) 架构中的 View-Model)。当用户提交更改时,您可以将临时模型对象复制到持久模型中。在 Core Data 中,您可以使用支持单独托管对象上下文的内存中持久存储来保存这些临时实例,然后在提交时将来自该临时上下文的更改合并到您的主上下文中。

    【讨论】:

      【解决方案2】:

      这可能就足够了:

      • 在 Interface Builder 中选择文本字段。
      • 切换到 Inspector 面板的“Text Field Attributes”面板(点击 Cmd-1)。
      • 将“操作”弹出框更改为“仅在输入时发送”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-01
        • 2018-09-11
        • 2015-12-01
        • 1970-01-01
        • 2020-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多