2011-09-28 56 views
1

當我打開多個UIAlertViews時,我的鍵盤自動關閉然後重新打開,出現奇怪的問題。如果我有一個鍵盤(來自單獨的UITextField)並顯示一個UIAlertView,那麼在解除該警報後,我打開另一個(在didDismissWithButtonIndex中打開第二個)。當我解僱第二個人時,它解散了鍵盤,然後返回。如果我在連續超過2條警報的情況下嘗試此操作,它將在第二條警報解除後仍會關閉我的鍵盤,但直到最後一條警報解除爲止纔會顯示。問題在於鍵盤委託函數沒有被調用,所以我無法迴應它被解僱。我有其他的UI元素(文本框和圖像),當鍵盤打開時會移動,所以當它關閉時,這些元素會浮在屏幕上,看起來很奇怪。任何想法爲什麼該鍵盤會自動解散?謝謝多個UIAlertViews打開後鍵盤解散

順便說一下,我使用NSDictionary對象的NSMutableArray隊列警報,如果已經顯示警報需要顯示。我一次不會創建並顯示超過1個警報。

編輯:這裏是示例代碼。如果您運行此操作,則在您解除「1」後,您會看到兩個警報均打開(0和1),您會在其下看到「0」。在您解除'0'之後,您會看到我的意思 - 它們的鍵盤會暫時關閉並打開,但不會調用委託功能。如果您將我設置爲高於2的值,您會看到關閉鍵盤在關閉第二次提醒後仍然關閉,但會一直關閉,直到最後一次提醒被解除。我也試過只打開一個UIAlert,並且從隊列中一個一個地打開其他人,因爲每個人都被解僱,並且仍然注意到同樣的行爲。有任何想法嗎?

編輯:一些更多的挖掘後,我發現,如果我註冊的通知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); 

} 
+0

如果你也提供你的代碼,它會很棒...... – Maulik

回答

4

只有當相應的UI元素是第一響應者時才顯示鍵盤。不知何故,多個警報視圖短時間修改響應者鏈。似乎是一個框架的問題..

我建議這種解決方法:

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

編輯

其實我現在認爲這與該應用程序的窗口層次做。 UIAlertViews創建自己的窗口(在窗口級別UIWindowLevelAlert),使它們成爲接收觸摸輸入的關鍵窗口,然後在解散時再次創建舊窗口關鍵窗口。當您在didDismiss上顯示新的警報視圖時,UIKit似乎會丟失(暫時)跟蹤關鍵窗口和響應器鏈。
上述修復程序當然仍然適用。

+0

很棒!我不認爲我會想到這一點:)謝謝馬丁! – sjensenMMG