2010-11-01 67 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