我有一个 UITextView 始终具有焦点的视图。我想要做的是扩展内置的撤消/重做行为以支持我以编程方式设置文本时的撤消/重做(例如,当我清除它时,通过将其设置为@"")。
由于只有 firstResponder 获得撤消/重做事件,我想我只需使用 UITextView 的 undoManager 属性来创建我的调用。例如,
// 在清除文本之前... [[self.myTextView.undoManager prepareWithInvocationTarget:self] undoClear:self.myTextView.text]; [self.myTextView.undoManager setActionName:@"Clear"]; // ... -(void)undoClear:(NSString *)textToRestore { self.myTextView.text = textToRestore; if ([self.myTextView.undoManager isUndoing]) { // 准备重做。 [[self.myTextView.undoManager prepareWithInvocationTarget:self] undoClear:@""]; } }
不幸的是,这不起作用。它:
- 将一个空项引入撤消堆栈(“撤消”)
- 在该项目之后添加“撤消清除”(如果我点击“撤消”,我会看到“撤消清除”)
- 但是,撤消清除和重做清除工作,然后我再次看到“撤消清除”,并且从那里开始不起作用。
有任何想法吗?我接近这个错误吗?
更新:似乎我已经解决了空的撤消项问题:它发生在我调用 prepareWithInvocationTarget后设置 UITextView 的文本时。如果我之前调用它,它不会发生。有趣的是,如果我不调用 prepareWithInvocationTarget (即,通常,当我设置 UITextView 的文本时),空项目不会被推入撤消堆栈。