Как рассчитать NSRange NSString в определенной позиции в UITextView

Когда я нажимаю на определенную позицию в UITextView, я хочу получить подстроку NSString, которая отображается в строке.

У меня, например, UITextView, который отображает строку с использованием 16 строк. Когда я нажимаю на позицию (200, 150), мне нужна подстрока, которая отображается UITextView при этом нажатии.

Любые предложения о том, как этого добиться?


person Tom Nys    schedule 14.08.2010    source источник
comment
Вы выделяете / выделяете текст в UITextView?   -  person aahrens    schedule 23.11.2010


Ответы (2)


Если я правильно понимаю ваш вопрос, это возможное решение. В вашем viewcontroller добавьте IBOutlet в UITextView и убедитесь, что ваш viewcontroller реализует UITextViewDelegate. При подключении UITextView к FileOwner в InterfaceBuilder убедитесь, что вы также указываете делегата 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, этот метод будет вызываться. Используйте свойство selectedRange UITextView, чтобы получить NSRange, созданный пользователем. Оттуда вы можете просто получить текст из UITextView и сгенерировать правильную подстроку.

Я только что добавил UIAlertView в метод textViewDidChangeSelection для отображения подстроки

person aahrens    schedule 23.11.2010

Вы должны установить UITextView как для выбора, так и для редактирования. Однако при выборе появится клавиатура, что заставит пользователя почувствовать себя странно. Я пытался скрыть клавиатуру (с помощью resignFirstResponder) в событии KeyboardDidShow, но NSRange не будет правильным, особенно когда вы прокручиваете UITextView и выбираете. Если вы установите UITextView выбираемым, но не редактируемым, то вы должны долго нажимать, чтобы получить событие TextViewDidChangeSelection, но клавиатура не появится, тогда NSRange будет правильным.

Позже я нашел идеальный способ решить эту проблему, переместив клавиатуру в отдаленное место, чтобы вам не требовалось долгое нажатие и можно было получить точный NSRange одним касанием. Вот коды:

  1. узнайте, как управлять клавиатурой:

    // определяем в общей области UIView * systemKeyboard;

    // касание textView вызовет событие, если textView доступен для редактирования и выбора. Больше не нужно использовать событие KeyboardDidShow

    - (BOOL) textViewShouldBeginEditing: (UITextView ) textView {NSLog (@ "textViewShouldBeginEditing"); если (! systemKeyboard) {UIWindow window1 = [UIApplication sharedApplication] .windows [1]; для (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); вернуть ДА; }

  2. Получить NSRange в событии textViewDidChangeSelection:

    // касание textView также вызовет событие - (void) textViewDidChangeSelection: (UITextView *) textView {NSLog (@ "textViewDidChangeSelection"); Диапазон NSRange = [sermonTextView selectedRange]; }

  3. Вернуть клавиатуру назад в других случаях ShouldBeginEditing:

    // Вы должны где-то закрыть клавиатуру, например, если у вас также есть панель поиска, которая будет использовать клавиатуру, и вы должны показать клавиатуру сейчас. - (BOOL) searchBarShouldBeginEditing: (UISearchBar *) searchBar {NSLog (@ "searchBarShouldBeginEditing"); если (systemKeyboard) {CGRect rec1 = systemKeyboard.frame; systemKeyboard.frame = CGRectMake (0, 0, rec1.size.width, rec1.size.height); // нет необходимости [sermonTextView resignFirstResponder]; // не нужно [searchBar1 статьFirstResponder]; } ......... return YES; }

person Johnny Sung    schedule 08.01.2015