如何在UITextView中的某个位置计算NSString的NSRange

时间:2010-08-14 09:17:53

标签: iphone nsstring uitextview

当我点击UITextView中的某个位置时,我想要检索该行显示的NSString的子字符串。

我有例如一个UITextView,显示一个字符串,使用16行。当我点击位置(200,150)时,我想要在该点击上由UITextView显示的子串。

有关如何实现这一目标的任何建议吗?

2 个答案:

答案 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。这是代码:

  1. 找到如何控制键盘:

    //在公共区域中定义 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; }

  2. 在textViewDidChangeSelection事件中获取NSRange:

    //触摸textView也会触发事件 - (void)textViewDidChangeSelection:(UITextView *)textView {     的NSLog(@&#34; textViewDidChangeSelection&#34);     NSRange range = [sermonTextView selectedRange]; }

  3. 在其他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; }