3

我有以下代码:

- (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里面 a UITableView,所以当用户点击外面时UITextField,我想退出键盘。

我该如何解决这个问题,以便在用户想要并且键盘仍然处于活动状态时可以拒绝自动更正?为什么这可以与 clearButton 一起正常工作,但在拒绝自动更正时却不行?

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

4

2 回答 2

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

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

于 2012-02-29T11:02:20.850 回答
0

kenji 的解决方案效果很好,除了不包括 UIControl-s。这是他的解决方案的更清洁和更简单的版本:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    return ![touch.view isKindOfClass:NSClassFromString(@"UIAutocorrectInlinePrompt")];
}
于 2013-01-06T06:24:58.353 回答