繁体   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