【问题标题】:NSUndoManager and replacing/skipping undo stepsNSUndoManager 和替换/跳过撤消步骤
【发布时间】:2020-05-19 17:26:22
【问题描述】:

有什么方法可以告诉undoManager,在某些情况下,撤消步骤在编辑发生之前就已经提交了吗?

我有一个应用程序可以自动将某些字符串替换为大写对应的字符串。麻烦的是,这必须在textStorage 中自动完成,所以当撤消编辑时,文本仍然是大写的。

我已经为有问题的操作编写了自定义撤消状态,它们是在NSTextView shouldChangeTextInRange 中创建的:

例如:

[[self.undoManager prepareWithInvocationTarget:self] 
       replaceCharactersInRange:
             NSMakeRange(affectedCharRange.location + affectedCharRange.length, string.length + 1) withString:string
];

我希望undoManager 忽略编辑后将收到的撤消步骤。

【问题讨论】:

    标签: objective-c macos cocoa nsundomanager


    【解决方案1】:

    一种方法是使用[self.undoManager disableUndoRegistration]; 禁用NSUndoManager 记录撤消步骤。然后,操作完成后,您可以再次使用[self.undoManager enableUndoRegistration]启用它。

    这似乎是一种有点危险的方法,因为它真的会弄乱你的撤销堆栈。

    我通过在注册 NSTextView 撤消之前执行额外的撤消步骤来解决此问题:

    [self.undoManager registerUndoWithTarget:self handler:^(id _Nonnull target) {
        [self replaceCharactersInRange:undoStringRange withString:undoString];
    }];
    

    不过,重做可能会造成伤害,因为整个受影响的字符串可能不会在文本视图的内部方法中注册。

    【讨论】:

      猜你喜欢
      • 2011-08-12
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多