【问题标题】:Why this code fails to empty undo stack为什么此代码无法清空撤消堆栈
【发布时间】:2009-10-20 05:24:47
【问题描述】:
- (void)cancel {
//   [managedObjectContext.undoManager disableUndoRegistration];
     [managedObjectContext deleteObject:object]; // I don't want this deletion to be recorded on the undo stack which is empty at this point.
//   [managedObjectContext.undoManager enableUndoRegistration];
     [managedObjectContext.undoManager removeAllActions];
}

使用此代码,我仍然在撤消堆栈上删除,即使取消注释这两行也无法阻止记录。为什么?

【问题讨论】:

    标签: iphone core-data undo


    【解决方案1】:

    在禁用和重新启用撤消处理之前,您需要在托管对象上下文上调用 -processPendingChanges。 Core Data 延迟注册撤消事件,直到 processPendingChanges 允许合并对同一属性和类似快捷方式的多个更改。

    【讨论】:

      【解决方案2】:

      什么叫-cancel?我遇到过一些其他方法正在注册撤消事件的情况(核心数据可能“有帮助”为您执行此操作)。您可能会发现您的撤消堆栈在 -cancel 结束时为空,但得到了调用方法添加的事件。

      在这些情况下,选择“撤消”实际上并没有(取消)做任何事情,事件没有什么可撤消的。为了防止这些多余的事件,您需要在调用方法中禁用撤消注册(然后重新启用它)。类似的东西......

      - (void)doSomething {
          // Disable undo until we definitely want to undo stuff
          [managedObjectContext.undoManager disableUndoRegistration];
      
          // Stuff goes here
      
          if ( userCancelled ) {
              [self cancel];
              [managedObjectContext.undoManager enableUndoRegistration];
              return;
          }
      
          // We actually want user to be able to undo the following stuff
          [managedObjectContext.undoManager enableUndoRegistration];
      
          // More stuff goes here
      }
      

      在深入研究之前,请先做一些简单的 NSLog 检查,以查看何时撤消堆栈上的内容(并确保您将消息发送到真实的 NSUndoManager 而不是 nil 对象)。

      【讨论】:

      • 1.一个按钮触发-取消。 2. 除了尝试撤消外,我如何才能找到撤消堆栈是否为空?此信息已封装,因此我无法登录。 3. 我的“撤消”确实触发了撤消我删除的操作。 4. 没有撤消管理器?哦,不,当然。不过谢谢提醒。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 2017-10-06
      • 2013-12-16
      • 1970-01-01
      相关资源
      最近更新 更多