2010-11-01 68 views
3

我有一个视图,UITextView总是有焦点。我想要做的就是扩展内置的撤销/重做行为,以便在编程设置文本时支持撤消/重做(例如,当我清除它时,通过将其设置为@“”)。用UITextView撤消/重做(iOS/iPHone)

由于只有firstResponder获得撤销/重做事件,我以为我只是简单地使用UITextView的undoManager属性来创建我的调用。例如,

// Before clearing the text... 
[[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]) 
    { 
     // Prepare the redo. 
     [[self.myTextView.undoManager prepareWithInvocationTarget:self] undoClear:@""]; 
    } 
}

不幸的是,这是行不通的。它:

  1. 提出一种新的空项目为
  2. 的“撤消清除”该项目后,被添加(如果我点击“撤销”,我看到了“撤消清除”)撤消堆栈(“撤消”)
  3. 撤销清除和重做清除工作,但是,然后我再次看到“撤消清除”,它从此不起作用。

任何想法?我接近这个错误吗?

更新:好像我已经想通了空撤销项目的问题:当我设置的UITextView 后,我叫prepareWithInvocationTarget的文本它发生。如果我以前打过电话,它不会发生。有趣的是,如果我不调用prepareWithInvocationTarget(即,通常,当我设置UITextView的文本),则空项不会被推入撤消堆栈。

回答

3

OK,想通了:

问题与#1作为更新我原来的职位概述。

问题#2和#3只是我错误地使用NSUndoManager。我最终不清楚方法(该方法被调用在索马里发展事务处如下:。

-(void)undoClear:(NSString *)textToRestore 
{ 
    NSString *textBackup = [self.myTextView.text copy]; 

    self.myTextView.text = textToRestore; 

    if ([self.myTextView.undoManager isUndoing]) 
    { 
     // Prepare the redo. 
     [[self.myTextView.undoManager prepareWithInvocationTarget:self] undoClear:@""];  
    } 
    else if ([self.myTextView.undoManager isRedoing]) 
    { 
     [[self.myTextView.undoManager prepareWithInvocationTarget:self] undoClear:textBackup]; 
    } 

    [textBackup release]; 
}

它的工作,因为它现在应该

+0

您好,我想我的问题是与此类似,u能告诉我,什么方法调用undoClear方法?谢谢 – 2011-01-26 03:48:01

+0

@Risma:就在你设置textView的内容之前。 – 2011-03-16 10:04:54

+1

我尝试实现这种方法时遇到的一个问题是,所有先前的undos都会被擦除。所以,如果他们打字输入,然后点击“清除”,并想要撤消两次,它只会让他们回到他们以前的文字内容。 – Philosophistry 2011-09-07 01:47:01

0

我不告你有多少文本字段有工作,虽然textBackup不得到保留prepareWithInvocationTarget:它是如何仍然在撤消堆栈几个明确的后来?看起来像它可能仍然在那里后第一个,但不是在第二个之后或Autorelease池刷新后

1

你可以改变你的textview到任何你想要的文本,并保留撤消和重做管理器的内存堆栈。self.content i UITextView。

-(void) yourClearAllButtonIsPressed 
{ 
    [[self.content.undoManager prepareWithInvocationTarget:self] undoClear:self.content.text]; 
    [self.content setText:@""];//Or something else you want to change your textview to 
} 

} 

//只有一个,我的方法,我创建

-(void) undoClearBlablabla:(NSString*) text 
    { 
     [[self.content.undoManager prepareWithInvocationTarget:self] undoClear:self.content.text]; 
     [self.content setText:text]; 
    } 
+0

你为什么要这样?你可以解释吗?这对我来说是一个非常好的工作解决方案。 – coolcool1994 2014-02-10 07:15:52

+0

是的,请解释为什么有人会这样-1,这看起来是正确的! – strange 2014-05-12 19:28:27