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外側を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のサブビューでもあります。UITextFieldUITtextView

編集:クラスのチェックは、のUITextField場合、UIAutocorrectInlinePromptビューがフィールドの子孫ではないため、より適切です(iOS 4.3および5.0でテスト済み)。問題は、このクラスはプライベートクラスであるため、名前を変更できることです。

于 2012-02-29T11:02:20.850 に答える