UITapGestureRecognizer和自动更正

时间:2011-07-28 15:05:55

标签: iphone tap autocorrect

我有以下代码:

- (void)viewDidLoad
{
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self 
                                    action:@selector(dismissKeyboard)];
    [self.view addGestureRecognizer:tap];
    tap.cancelsTouchesInView = NO;
    tap.delegate = self;
    [tap release];
}

-(void)dismissKeyboard {
    [self.textField resignFirstResponder];
}

textField有一个clearButton并启用了自动更正。当我点击clearButton时,一切正常,键盘在UITextField被清除后仍然显示。但是,当我不想接受建议的自动更正时,键盘会消失,我的文字会被建议的文本替换。

我需要UITapGestureRecognizer,因为UITextField内有UITableView,所以当用户点击UITextField时,我想重新签名键盘。

如何解决此问题,以便在用户需要时可以拒绝自动更正,键盘仍处于活动状态?为什么这对clearButton正常工作,但在拒绝自动校正时却不能正常工作?

编辑:它与clearButton一起使用,因为它在UITextField内。因此,手势没有被解雇。但是当点击建议的文本更正时,会被触发...有没有办法检查用户是否点击了建议的文本更正?

2 个答案:

答案 0 :(得分:1)

这是我在实现蓝色自动更正文本时解决问题的手势委托方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    BOOL handleTouch = NO;
    UIView *v = [self.view hitTest:p withEvent:nil];
    Class autocorrectionCancelClass = NSClassFromString(@"UIAutocorrectInlinePrompt");
    if( ![v isKindOfClass:UIControl.class] && ![v isKindOfClass:autocorrectionCancelClass]  && ![v isDescendantOfView:currentlyEditedTextView] )
    {
        handleTouch = YES;
    }

    return handleTouch;
}

点击自动更正取消按钮,v是私有SDK类UIAutocorrectInlinePrompt的视图,但它也是已编辑的UITextField / UITtextView的子视图。

编辑:检查类是否更好,因为对于UITextFieldUIAutocorrectInlinePrompt视图不是该字段的后代(在iOS 4.3和5.0上测试)。问题是这个类可以重命名,因为它是私有的。

答案 1 :(得分:0)

除了排除UIControl-s之外,kenji的解决方案运行良好。 这是他解决方案的一个更简洁的版本:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    return ![touch.view isKindOfClass:NSClassFromString(@"UIAutocorrectInlinePrompt")];
}