1

複数のUIAlertViewを開くと、キーボードが自動的に閉じてから再び開くという奇妙な問題が発生しています。(別のUITextFieldからの)キーボードがあり、UIAlertViewを表示している場合、そのアラートを閉じると、別のアラートを開きます(didDismissWithButtonIndexで2番目のキーボードを開きます)。2つ目を閉じると、キーボードが閉じてから元に戻ります。2つ以上のアラートを続けてこれを試してみると、2番目のアラートが閉じられた後もキーボードは閉じますが、最後のアラートが閉じられるまで表示されません。問題は、キーボードデリゲート関数が呼び出されないため、却下されたことに応答できないことです。他のUI要素(テキストフィールドと画像)があり、キーボードを開くとシフトするため、閉じると画面に浮かび、奇妙に見えます。そのキーボードが自動的に閉じる理由はありますか?ありがとう

ところで、私はNSDictionaryオブジェクトのNSMutableArrayを使用して、アラートがすでに表示されている場合に表示する必要があるアラートをキューに入れます。一度に複数のアラートを作成して表示することはありません。

編集:これがサンプルコードです。これを実行すると、「1」を閉じた後、両方のアラートが開いている(0、1)のが表示され、その下に「0」が表示されます。「0」を閉じると、私が何を意味するかがわかります。キーボードは一時的に閉じたり開いたりしますが、デリゲート関数は呼び出されません。iを2より大きい値に設定すると、2番目のアラートを閉じた後もキーボードは閉じますが、最後のアラートが閉じられるまで閉じたままになります。また、UIAlertを1つだけ開いて、それぞれが却下されたときにキューから他のUIAlertを一度に1つずつ開いてみましたが、それでも同じ動作に気づきました。何か案は?

編集:もう少し掘り下げた後、通知UIKeyboardDidShowNotificationとUIKeyboardDidHideNotificationに登録すると、キーボードが自動的に閉じられて表示されたときに実際に起動されることがわかりました。基盤となるAPIの何が原因で発生しているのかを知りたいので、回避できることを願っています。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
// Override point for customization after application launch.
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 100, 320, 48)];
[textField setDelegate:self];
[textField setBackgroundColor:[UIColor redColor]];
[window addSubview:textField];
[textField release];
[self.window makeKeyAndVisible];
return YES;
}

- (BOOL)textFieldShouldReturn:(UITextField *) textField{
NSLog(@"textFieldShouldReturn called with %@", textField);
[textField resignFirstResponder];
return YES;
}


-(void) textFieldDidBeginEditing:(UITextField *)textField 
{
NSLog(@"textFieldDidBeginEditing called with %@", textField);
for (int i=0; i< 2; i++) {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"test" message: [NSString stringWithFormat:@"%d", i] delegate:self cancelButtonTitle:NSLocalizedString(@"OK",@"") otherButtonTitles:nil];
    [alert show];
    [alert release];
}
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
NSLog(@"++++ textFieldShouldEndEditing %@", textField);
return YES;
}

-(void) textFieldDidEndEditing:(UITextField *)textField
{
NSLog(@"++++ textFieldDidEndEditing %@", textField);

}
4

1 に答える 1

4

キーボードは、対応するUI要素が最初のレスポンダーである場合にのみ表示されます。どういうわけか、複数のアラートビューがレスポンダーチェーンを短時間変更します。フレームワークの問題のようです。

この回避策をお勧めします:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    dispatch_async(dispatch_get_main_queue(), ^{
        /* show new alert view here */
    });
}

編集

実際、私は今、それがアプリケーションのウィンドウ階層に関係していると思います。UIAlertViewsは、(ウィンドウレベルで)独自のウィンドウを作成し、UIWindowLevelAlertタッチ入力を受け取るためのキーウィンドウにしてから、閉じたときに古いウィンドウのキーウィンドウを再度作成します。didDismissで新しいアラートビューを表示すると、UIKitはキーウィンドウとレスポンダーチェーンを(一時的に)追跡できなくなるようです
。もちろん、上記の修正は引き続き適用されます。

于 2011-09-29T18:16:15.147 に答える