2012-10-25 132 views
3

我有一個UITextView配置了一個委託。我已通過將allowsEditingTextAttributes設置爲YES來啓用編輯屬性。UITextView不觸發textViewDidChange屬性更改?

當用戶在文本視圖中鍵入一個字符時,代表收到textViewDidChange:消息。

但是,當用戶更改屬性(如進行選擇和點擊粗體或斜體)時,沒有textViewDidChange:消息。

文檔特別說textViewDidChange:當用戶改變屬性應該收到一條消息:

告訴代表該文本或在指定的文本視圖屬性由用戶發生了變化。

但它不適合我。我在這裏錯過了什麼?

+1

您正在設置UITextViewDelegate ... –

+0

不知道你在說什麼,Venkat。 – stevex

回答

5

我在iOS 6中測試了這個方案,並有完全相同的結果:「選擇」彈出窗口中的屬性更改未觸發方法textViewDidChange:。看起來這是一個錯誤或文檔需要澄清哪種屬性更改會觸發此事件。

可能的解決方法是實現textViewDidChangeSelection:方法。無論何時做出選擇(用戶在更改屬性之前必須執行的操作),都會調用它。檢查selectedRange.length是否> 0(這意味着選擇了實際的單詞,而不是僅僅移動光標),並保存該選定的範圍。一旦長度再次爲零,這意味着他們取消選擇該項目。那時,你可以採取以前的範圍和文本工作。

- (void)textViewDidChangeSelection:(UITextView *)textView 
{ 
    static BOOL rangeSet = NO; 
    static NSRange mySelectedRange; 
    if(textView.selectedRange.length > 0 && !rangeSet) 
    { 
     mySelectedRange = textView.selectedRange; 
     rangeSet = YES; 
    } 
    else if(textView.selectedRange.length == 0 && rangeSet) 
    { 
     // Work with text 
     NSLog(@"Working with previously select text: %d, %d", mySelectedRange.location, mySelectedRange.length); 
    } 
} 
+0

它看起來像一個錯誤不是嗎?我要提交一份雷達。 – stevex

3

請檢查您是否在.h文件中設置了UITextViewDelegate。你也必須'製作

yourTextView.delegate = self 

這樣你的文本視圖就可以控制你當前的類。

+0

它絕對設置。正如我所提到的,當用戶輸入時,我得到了textViewDidChange:消息。但是,當用戶在編輯彈出窗口中點擊粗體,斜體或下劃線時,沒有消息。 – stevex

3

documentation也已經提到,

This method is not called in response to programmatically initiated changes 

所以,如果你設置粗體或斜體編程,這樣就不會調用該委託的方法

+0

我沒有以編程方式設置它們 - 用戶通過點擊UITextView提供的編輯彈出窗口來設置它們。 – stevex

1

我身邊這讓通過繼承的UITextView,覆蓋toggleBoldface:toggleItalics:toggleUnderline:方法,並呼籲那些方法[self.delegate textViewDidChange:self]This answer幫我弄明白了。

相關問題