当我点击UITextView中的某个位置时,我想要检索该行显示的NSString的子字符串。
我有例如一个UITextView,显示一个字符串,使用16行。当我点击位置(200,150)时,我想要在该点击上由UITextView显示的子串。
有关如何实现这一目标的任何建议吗?
答案 0 :(得分:1)
如果我理解你的问题,这是一个可能的解决方案。在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来显示子字符串
答案 1 :(得分:0)
您必须将UITextView
设置为可选和可编辑。但是当您选择时键盘会显示,这会让用户感到奇怪。我试图在KeyboardDidShow
事件中隐藏键盘(通过resignFirstResponder),但NSRange
将不正确,尤其是当您滚动UITextView
并选择时。如果您将UITextView
设置为可选但不可编辑,则必须长按才能获得TextViewDidChangeSelection
事件,但键盘不会显示,然后NSRange
将是正确的。
后来我找到了一种解决问题的完美方法,将键盘移到远处,这样您就不需要长按,只需轻轻一按即可获得准确的NSRange。这是代码:
找到如何控制键盘:
//在公共区域中定义 UIView * systemKeyboard;
//如果textView可编辑且可选,则触摸textView将触发事件。不再使用KeyboardDidShow事件
- (BOOL)textViewShouldBeginEditing:(UITextView )textView { 的NSLog(@&#34; textViewShouldBeginEditing&#34); 如果(!systemKeyboard){ UIWindow window1 = [UIApplication sharedApplication] .windows [1]; for(int i = 0; i&lt; window1.subviews.count; i ++){ UIView * keyBoard1 = window1.subviews [i]; if([keyBoard1 isKindOfClass:NSClassFromString(@&#34; UIInputSetContainerView&#34;)]){ systemKeyboard = keyBoard1; //现在我们可以控制键盘位置 打破; } } } CGRect rec1 = systemKeyboard.frame; systemKeyboard.frame = CGRectMake(2000,2000,rec1.size.width,rec1.size.height); 返回YES; }
在textViewDidChangeSelection事件中获取NSRange:
//触摸textView也会触发事件 - (void)textViewDidChangeSelection:(UITextView *)textView { 的NSLog(@&#34; textViewDidChangeSelection&#34); NSRange range = [sermonTextView selectedRange]; }
在其他ShouldBeginEditing场合移回键盘:
//您必须关闭某些键盘,例如,如果您还有一个将使用键盘的搜索栏,您应该立即显示键盘。 - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar { 的NSLog(@&#34; searchBarShouldBeginEditing&#34); 如果(systemKeyboard){ CGRect rec1 = systemKeyboard.frame; systemKeyboard.frame = CGRectMake(0,0,rec1.size.width,rec1.size.height); //不需要[sermonTextView resignFirstResponder]; //不需要[searchBar1 becomeFirstResponder]; } ......... 返回YES; }