【发布时间】:2011-05-03 11:41:32
【问题描述】:
我有一个 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:@""];
}
}
很遗憾,这不起作用。它:
- 将一个空项引入撤消堆栈(“撤消”)
- 在该项目之后添加了“撤消清除”(如果我点击“撤消”,我会看到“撤消清除”)
- 撤消清除和重做清除工作,但是,然后我再次看到“撤消清除”,它从那里不起作用。
有什么想法吗?我是不是搞错了?
更新:似乎我已经解决了空撤消项问题:它发生在我设置 UITextView 的文本之后,我调用了 prepareWithInvocationTarget。如果我之前调用它,它不会发生。有趣的是,如果我不调用 prepareWithInvocationTarget(即,通常,当我设置 UITextView 的文本时),空项目不会被推入撤消堆栈。
【问题讨论】:
标签: iphone uitextview undo nsundomanager redo