簡體   English   中英

如何在UITextView中的某個位置計算NSString的NSRange

[英]How to calculate NSRange of NSString at certain position in UITextView

當我點擊UITextView中的某個位置時,我想要檢索該行顯示的NSString的子串。

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

有關如何實現這一目標的任何建議?

如果我理解你的問題,這是一個可能的解決方案。 在viewcontroller中,將一個IBOutlet添加到UITextView,並確保您的viewcontroller實現UITextViewDelegate。 在InterfaceBuilder中將UITextView連接到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來顯示子字符串

您必須將UITextView設置為可選擇和可編輯。 但是當您選擇時鍵盤會顯示,這會讓用戶感到奇怪。 我試圖在KeyboardDidShow事件中隱藏鍵盤(通過resignFirstResponder),但NSRange將不正確,尤其是當您滾動UITextView並選擇時。 如果您將UITextView設置為可選但不可編輯,那么您必須長按才能獲得TextViewDidChangeSelection事件但鍵盤不會顯示,那么NSRange將是正確的。

后來我找到了一種解決問題的完美方法,將鍵盤移動到遠處,這樣您就不需要長按,只需輕輕一按即可獲得准確的NSRange。 這是代碼:

  1. 找到如何控制鍵盤:

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

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

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

  2. 在textViewDidChangeSelection事件中獲取NSRange:

    // touch textView也會觸發事件 - (void)textViewDidChangeSelection:(UITextView *)textView {NSLog(@“textViewDidChangeSelection”); NSRange range = [sermonTextView selectedRange]; }

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

    //您必須關閉某些鍵盤,例如,如果您還有一個將使用鍵盤的搜索欄,您應該立即顯示鍵盤。 - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {NSLog(@“searchBarShouldBeginEditing”); if(systemKeyboard){CGRect rec1 = systemKeyboard.frame; systemKeyboard.frame = CGRectMake(0,0,rec1.size.width,rec1.size.height); //不需要[sermonTextView resignFirstResponder]; //不需要[searchBar1 becomeFirstResponder]; } .........返回YES; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM