[英]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。 這是代碼:
找到如何控制鍵盤:
//在公共區域定義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; }
在textViewDidChangeSelection事件中獲取NSRange:
// touch textView也會觸發事件 - (void)textViewDidChangeSelection:(UITextView *)textView {NSLog(@“textViewDidChangeSelection”); NSRange range = [sermonTextView selectedRange]; }
在其他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.