2010-08-14 64 views
3

當我點擊UITextView中的某個位置時,我想要檢索顯示在該行的NSString的子字符串。如何在UITextView的特定位置計算NSString的NSRange

我有例如一個顯示字符串的UITextView,使用16行。當我點擊位置(200,150)時,我想要在該水龍頭上顯示UITextView的子字符串。

有關如何實現此目的的任何建議?

+0

您是否在UITextView中選擇/高亮顯示文本? – aahrens 2010-11-23 19:15:30

回答

1

如果我正確理解你的問題,這是一個可能的解決方案。在您的視圖控制器中添加一個IBOutlet到UITextView,並確保您的視圖控制器實現了UITextViewDelegate。在將UITextView連接到InterfaceBuilder中的FileOwner時,請確保您也將UITextView的委託指向FileOwner。

@interface StackOverFlowViewController : UIViewController<UITextViewDelegate> { 

    IBOutlet UITextView *textView; 
} 
@end 

然後在你的UIViewController實現文件中添加這個UITextViewDelegate方法。

- (void)textViewDidChangeSelection:(UITextView *)aTextView { 

    NSRange rangeOfSelection = textView.selectedRange; 
    NSString *selectedText = [textView.text substringWithRange:rangeOfSelection]; 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Selection Changed" message:selectedText delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
} 

然後每次在UITextView中進行選擇時,都會調用此方法。使用UITextView的selectedRange屬性來獲取用戶所做的NSRange。從那裏你可以從UITextView獲取文本並生成正確的子字符串。

我只是在textViewDidChangeSelection方法添加一個UIAlertView中顯示的子

0

您必須設置UITextView都選擇和編輯。但是,當您選擇時,鍵盤會顯示出來,這會讓用戶感到陌生。我試圖在KeyboardDidShow事件中隱藏鍵盤(通過resignFirstResponder),但NSRange將不正確,尤其是當您滾動UITextView並進行選擇時。如果您設置UITextView可選但不可編輯,那麼您必須長按以獲取TextViewDidChangeSelection事件,但鍵盤不會顯示,則NSRange將是正確的。

後來,我發現了一個完美的方式來解決這個問題,將鍵盤移動到一個很遠的位置,所以你不需要長時間按壓,只需輕觸即可獲得準確的NSRange。這裏是代碼:

  1. 找到如何控制鍵盤:

    //定義在公共區域 的UIView * systemKeyboard;

    //觸摸textView將觸發事件,如果textView是可編輯和可選的。不再使用KeyboardDidShow事件

    - (BOOL)textViewShouldBeginEditing:(UITextView )textView NSLog(@「textViewShouldBeginEditing」); (!systemKeyboard)UIWindow window1 = [UIApplication sharedApplication] .windows [1];對於(int i = 0; i < window1.subviews.count; i ++){ UIView * keyBoard1 = window1.subviews [i]; if([keyBoard1 isKindOfClass:NSClassFromString(@「UIInputSetContainerView」)]){ systemKeyboard = keyBoard1; //現在我們可以控制鍵盤位置 break; } } } CGRect rec1 = systemKeyboard.frame; systemKeyboard。frame = CGRectMake(2000,2000,rec1.size.width,rec1.size.height); 返回YES; }

  2. 在textViewDidChangeSelection事件獲取NSRange:

    //觸摸的TextView將觸發事件,也 - (空)textViewDidChangeSelection:(UITextView的*)的TextView { 的NSLog(@ 「textViewDidChangeSelection」); NSRange範圍= [sermonTextView selectedRange]; }

  3. 回遷鍵盤在其他場合ShouldBeginEditing:

    //必須的忙關閉鍵盤,例如,如果您有也將使用鍵盤上輸入搜索欄,你現在應該顯示鍵盤。 (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {({「searchBarShouldBeginEditing」);如果(systemKeyboard)CGRect rec1 = systemKeyboard.frame; systemKeyboard.frame = CGRectMake(0,0,rec1.size.width,rec1.size.height); //不需要[sermonTextView resignFirstResponder]; //不需要[searchBar1 becomeFirstResponder]; } ......... return YES; }