[英]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.