2014-08-29 59 views
16
@implementation 
UIAlertView *query; 
@end 

- (void)viewWillAppear:(BOOL)animated { 
query = [[UIAlertView alloc] 
         initWithTitle:NSLocalizedString(@"New", @"") 
         message:nil 
         delegate:self 
         cancelButtonTitle:NSLocalizedString(@"Cancel", nil) 
         otherButtonTitles:NSLocalizedString(@"OK", @""), nil]; 
query.alertViewStyle = UIAlertViewStylePlainTextInput; 
UITextField *textField = [_query textFieldAtIndex:0]; 
textField.placeholder = NSLocalizedString(@"Title", @"placeholder text where user enters name for new playlist"); 
textField.delegate = self; 
[_query show]; 
} 

顯示鍵盤UIAlertView顯示後,鍵盤也顯示並UITextfield是焦點(這只是工作預iOS7,但在iOS8上不工作)。我試過[textfield becomeFirstResponder],但它不起作用。我創建新項目並使用上面的海灣,它的工作原理。UIAlertView中的文本框不iOS8上

我的問題:鍵盤不顯示UIAlertViewStylePlainTextInput風格。

我不知道爲什麼?任何人都可以幫助我嗎? 謝謝。

回答

9

這醜陋的黑客工作對我來說,調用後顯示:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
    // HACKHACK: This is to make the keyboard appear in iOS8 
    UITextRange* textRange = self.textField.selectedTextRange; 
    [self.textField selectAll:self]; 
    [UIMenuController sharedMenuController].menuVisible = NO; 
    self.textField.selectedTextRange = textRange; 
}); 

遇到同樣的問題,並與UIAlertController,這是「正確」的解決方案擺弄花了幾個小時,但遺憾的是在其他地方有幾個問題(例如,當從彈出窗口呈現時它會中斷),並且不適用於iOS7。

這絕對是iOS8中的一個錯誤。我希望蘋果很快就能解決這個問題。不幸的是,iOS7編譯的舊版二進制文件甚至不能使用。

+0

謝謝你的時間。使用GM xCode發佈版本時,首次顯示UIAlertView但鍵盤不顯示。第二次和以後,它總是顯示鍵盤。我認爲這是Apple的一個漏洞。我會嘗試像你的建議。再一次,謝謝。 – nmh 2014-09-17 03:09:32

+0

非常感謝:) – sum2000 2015-01-28 16:33:43

-2

The first page of the UIAlertView documentation狀態:

子類注 的UIAlertView中類旨在被原樣使用,並且不支持子類。該 類的視圖層次結構是私有的,不能修改。

有關外觀和行爲配置的更多信息,請參閱 「警報視圖」。

換句話說,你不應該搞亂UIAlertView窗口的內容。它實際上在比iOS 8更早的操作系統版本中起作用的事實僅僅是一種獎勵。從iOS 8開始已棄用。

你想在iOS 8中執行的操作是使用brand new UIAlertController class,它允許編輯文本字段。

+2

這是如何繼承的?這是一個簡單的舊技術,用於訪問'UIAlertView'的'textField(s)',除非我遺漏了一些東西。 – n00bProgrammer 2014-08-29 07:04:50

+0

@Michael Dautermann:謝謝你的回答。我的問題是鍵盤不會自動顯示,當我顯示樣式「UIAlertViewStylePlainTextInput」UIAlertView?我刪除了訪問alertview的文本字段的代碼,但它不顯示鍵盤。你有什麼建議嗎? – nmh 2014-08-29 07:14:37

+0

這是因爲UIAlertView中的視圖是私有的和只讀的。事實上,應用程序擺脫與它搞砸意味着事情可以(並在O.P.的情況下,他們*** ***)之間的主要iOS版本中斷。 – 2014-08-29 07:17:20

17

這裏有一個輕微的改善陳Lim的黑客/修復,放置在UIAlertViewDelegate:

- (void)didPresentAlertView:(UIAlertView *)alertView { 
    if (isIOS8) { 
     // hack alert: fix bug in iOS 8 that prevents text field from appearing 
     UITextRange *textRange = [[alertView textFieldAtIndex:0] selectedTextRange]; 
     [[alertView textFieldAtIndex:0] selectAll:nil]; 
     [[alertView textFieldAtIndex:0] setSelectedTextRange:textRange]; 
    } 
} 

(你必須實現一個isIOS8方法,屬性,或伊瓦。)

+0

非常感謝您抽出時間回答我的問題。 – nmh 2014-09-19 06:26:54

+4

只要在這個方法中做[tf selectAll:nil]似乎可以做到這一點。適用於7.1和8.1。 – 2014-10-27 20:09:39

+0

它通過第二次調用鍵盤顯示通知而不隱藏來打破「UITextView」大小。 – Dmitry 2014-11-26 15:46:55

0

對我而言,問題在於文本字段已經具有第一響應者狀態,所以當警告代碼被調用時,鍵盤已經可見。解僱這個領域解決了這個問題。

0

你看到這個在設備上,或只是在SIM卡?

似乎有一個問題與iOS8的SIM卡,它檢測到物理鍵盤,並沒有顯示軟件鍵盤。可能是故意的,因爲你在技術上使用的是物理鍵盤......它不是模擬測試的理想行爲。

嘗試命令K切換SIM卡中的軟件鍵盤,如果這是你的問題。

3

這可以幫助我解決所有相關的問題:

[MyUITextView endEditing:YES]; 

顯示UIAlertView之前所說的那樣。

+0

謝謝,這真的是解決方案! – k06a 2015-02-14 17:32:37

2

在我這種情況下,這是因爲UIViewController呈現UIAlertView實施canBecomeFirstResponder與YES結果,因爲我想聽'搖'事件。

一旦我添加了以下實施UIAlertViewDelegate方法提出了鍵盤預期:

- (void)willPresentAlertView:(UIAlertView *)alertView 
{ 
    [self resignFirstResponder]; 
} 

所以這可能不是解決所有與這個所謂的「不贊成使用」類的問題,但它是值得檢查您的控制器是否啓用了第一響應者的行爲。

0

我來與相同的情況交叉,我如何解決這個錯誤是試圖在顯示alertView之前辭去當前的響應者。並​​且UITextField的鍵盤彈出如預期。

UITextField *textField = ...; // Suppose textField is currently being edited. 
[textField resignFirstResponder]; // before showing,resign first. 

[_query show];