2013-04-19 4 views
0

То, что я:UITextView textViewDidChangeSelection вызывается дважды

TextView

NSArray (строка)

AVAudioPlayer (пока не реализовано)

Когда я выбираю слово в TextView:

• Проверьте, существует ли слово в Arra у

• Пуск аудиоплеер с соответствующим звуком

К сожалению, когда я нажимаю два раза, чтобы выбрать слово внутри TextView, textViewDidChangeSelection вызывается дважды. Я не знаю, почему я дважды вижу «Юпи».

Я просто изменил inputView, чтобы скрыть клавиатуру, потому что мне нужен TextView для использования в режиме выбора.

- (void)textViewDidChangeSelection:(UITextView *)tve; 
{ 
    NSString *selectedText = [tve textInRange:tve.selectedTextRange]; 
    if(selectedText.length > 0) 
    { 
     for (NSString *text in textArray) 
     { 
      if ([selectedText isEqualToString:text]) 
      NSLog(@"Youpie"); 
      tve.selectedTextRange = nil; 
      if (ps1.playing == YES) 
      { 
       [self stopEveryPlayer]; 
       [self updateViewForPlayerState:ps1]; 
      } 
      else if ([ps1 play]) 
       { 
        [self updateViewForPlayerState:ps1]; 
        fileName.text = [NSString stringWithFormat: @"%@ (%d ch.)", [[ps1.url relativePath] lastPathComponent], ps1.numberOfChannels, nil]; 
       } 
       else 
        NSLog(@"Could not play %@\n", ps1.url); 
      break; 
      } 
     } 
    } 
} 

- (void)awakeFromNib 
{ 
    textArray = [[NSArray alloc] initWithObjects:@"dog",@"cat",@"person",@"bird",@"mouse", nil]; 
    textView.inputView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; 
    textView.delegate = self; 
// ... 
} 

Я заметил что-то, когда я дважды постучал по каждому доброму слову в своем тексте.

textViewDidChangeSelection

Если слово уже выбран и никаких действий не выбрали, у меня есть 1 "Youpie".

Если нет, у меня есть 2 «Youpie».

Я нашел простое решение. Я удалил selectedRange после получения значения. textViewDidChangeSelection вызывает один раз.

Что я изменил

tve.selectedTextRange = nil; 

Я использую подкласс UITextView для отключения меню.

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{ 
    return NO; 
    return [super canPerformAction:action withSender:sender]; 
} 

Я добавил реализацию для AVAudioPlayer (PS1) тоже.

Мой «автозапуск» работает, если известное слово выбора :)

ответ

1

У меня нет ответа, почему метод вызывается дважды или как предотвратить это, но альтернативное решение может быть для отображения дополнительный элемент в меню редактирования, который появляется в текстовом представлении, когда слово двойным щелчком. Затем ваше действие для инициирования звука, основанного на слове, может быть вызвано из селектора действий, определенного в этом дополнительном элементе меню. В этом проекте вы удалили бы textViewDidChangeSelection и, следовательно, не получили бы вызов дважды. См. http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/AddingCustomEditMenuItems/AddingCustomEditMenuItems.html для получения дополнительной информации об изменении стандартного меню.

+0

спасибо. Это дает мне больше идей для решения этой проблемы. – 2013-04-19 17:55:59

+0

Я нашел решение после сновидений. Я не могу в это поверить ... Пользовательское меню - тоже хороший выбор. Я уверен, что буду использовать его в другом случае :) – 2013-04-20 10:10:42

Смежные вопросы