我有一个视图,其中UITextView始终具有焦点。我想做的是扩展内置的撤消/重做行为来支持撤消/重做,以便在我以编程方式设置文本时(例如,当我将其清除时,通过将其设置为@“”),也能够支持撤消/重做。
由于只有第一响应者可以获得撤消/重做事件,因此我认为我可以简单地使用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:@""]; } }
不幸的是,这并没有起作用。它:
1.引入了一个空项目到撤消堆栈中(“撤消”) 2.“撤消清除”在该项目之后添加(如果我点击“撤消”,我会看到“撤消清除”) 3.Undo Clear和Redo Clear工作,但是然后我再次看到“Undo Clear”,从那时起它就不起作用了。
有什么想法吗?我是否错了?
更新:似乎我已经找到了空撤消项的问题:当我在调用prepareWithInvocationTarget之后设置UITextView的文本时会发生这种情况。如果我在之前调用它,它就不会发生。有趣的是,如果我不调用prepareWithInvocationTarget(即通常情况下,当我设置UITextView的文本时),则不会将空项目推送到撤消堆栈中。
由于只有第一响应者可以获得撤消/重做事件,因此我认为我可以简单地使用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:@""]; } }
不幸的是,这并没有起作用。它:
1.引入了一个空项目到撤消堆栈中(“撤消”) 2.“撤消清除”在该项目之后添加(如果我点击“撤消”,我会看到“撤消清除”) 3.Undo Clear和Redo Clear工作,但是然后我再次看到“Undo Clear”,从那时起它就不起作用了。
有什么想法吗?我是否错了?
更新:似乎我已经找到了空撤消项的问题:当我在调用prepareWithInvocationTarget之后设置UITextView的文本时会发生这种情况。如果我在之前调用它,它就不会发生。有趣的是,如果我不调用prepareWithInvocationTarget(即通常情况下,当我设置UITextView的文本时),则不会将空项目推送到撤消堆栈中。