2015年6月3日水曜日

UIAlertView + UITextField の組み合わせでアラート表示後にキーボードが出てしまう

例えば、UITextField にフォーカスを合わせて、値を入力し OK ボタンなどで各処理後にアラートを表示すると、アラートが表示後にキーボードが出てしまう状態に遭遇してしまった。

この表示されたキーボードを下げることが出来るなら良いが、AlertView の OK ボタンはキーボードに隠れてしまい、キーボードの Done や 完了ボタンを押しても下がらない。。。

ビューの endEditing:YES にしても変わらず。
こうなってくると大体どの View のキーボードなのかも分からない。。。

キーボードの表示の通知を取得して、View に存在するもののフォーカスを外すなどしても変わらず。

調べた所どうやらこれは、
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
メソッド内で、続けてアラートビューを出そうとしていることが原因のようだ。

続けてアラートビューを出したい場合は、
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
に記述しないと行けないとのこと。


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch (buttonIndex) {
        ...
        case 1:     // OK
            // ここはだめ
            [self showAlert:@"OKしました。"];
            break;

        default:
            break;
    }
}

- (void)showAlert:(NSString *)message
{
    dispatch_async(dispatch_get_main_queue(), ^{
        // メインスレッドに戻して呼び出す。
        UIAlertView *alert
        = [[UIAlertView alloc] initWithTitle:@"メッセージ"
                                     message:message
                                    delegate:self
                           cancelButtonTitle:@"OK"
                           otherButtonTitles:nil, nil];
        [alert show];
    });

}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    switch (buttonIndex) {
        case 0:     // キャンセル
            return;
            break;

        case 1:     // OK ボタン
            // ここで呼ばないと行けない。
            [self showAlert:@"OKしました。"];
            break;
        default:
            break;
    }
}

確かに、キーボードが隠れてしまう状況は発生しなくなった。

Written with StackEdit.

0 件のコメント:

コメントを投稿