UITextView textViewDidChangeSelection被调用两次

时间:2013-04-19 15:18:39

标签: ios nsarray uitextview avaudioplayer

我有什么

的TextView

NSArray(字符串)

AVAudioplayer(尚未实施)

当我在TextView中选择一个单词时:

•检查数组中是否存在单词

•启动具有相关声音的Audioplayer

不幸的是,当我点击两次以在TextView中选择一个单词时,会调用textViewDidChangeSelection两次。我不知道为什么我会两次看到“Youpie”。

我刚刚更改了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 个答案:

答案 0 :(得分:1)

我没有答案为什么方法被调用两次或如何防止这种情况,但另一种解决方案可能是在一个单词是双重的时候在文本视图中弹出的编辑菜单中显示另一个项目点击。然后,可以从该附加菜单项中定义的动作选择器触发基于该单词启动声音的动作。在此设计中,您将删除textViewDidChangeSelection,因此不会被调用两次。有关修改标准菜单的其他信息,请参阅http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/AddingCustomEditMenuItems/AddingCustomEditMenuItems.html