Iphone UITapGestureRecognitor和自动校正

Iphone UITapGestureRecognitor和自动校正,iphone,tap,autocorrect,Iphone,Tap,Autocorrect,我有以下代码: - (void)viewDidLoad { UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; [self.view addGestureRecognizer:tap]; tap.cancelsTouc

我有以下代码:

- (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];
}
文本字段有一个clearButton(清除)按钮,并启用自动更正。当我点击Clear按钮时,一切正常,清除
UITextField
后,键盘仍会出现。但是,当我不想接受建议的自动更正时,键盘将消失,我的文本将替换为建议的文本

我需要
uitappesturerecognizer
,因为我在
UITableView
中有
UITextField
,所以当用户在
UITextField
之外单击时,我想退出键盘

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


编辑:它与clearButton一起正常工作,因为它位于
UITextField
内。因此,该手势不会被触发。但当点击建议的文本更正时,它会被触发。。。有没有办法检查用户是否单击了建议的文本更正?

以下是我为解决点击蓝色自动更正文本时出现的问题而实施的手势委托方法:

- (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;
}
点击autocorrection cancel(自动更正取消)按钮,v是私有SDK类的视图
UIAutocorrectInlinePrompt
,但它也是已编辑的
UITextField
/
UITextView
的子视图


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

kenji的解决方案运行良好,除了排除UIControl-s。 以下是他的解决方案的更简洁版本:

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