2014-09-25 36 views
12

我試圖使用iOS 8 UIAlertController到位的,我會用過去一個UIAlertView。我希望用戶能夠將文本輸入到此警報中,並點擊「確定」處理文本或「取消」以取消。帶文本字段的UIAlertController - 點擊返回按鈕只隱藏鍵盤,不執行操作?

這裏的基本代碼:

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Change Value" message:@"Enter your new value."]; 
[alert addTextFieldWithConfigurationHandler:nil]; 

[alert addAction: [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
    UITextField *textField = alert.textFields[0]; 
    NSLog(@"text was %@", textField.text); 
}]]; 

[alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { 
    NSLog(@"Cancel pressed"); 
}]]; 

[presentingVC presentViewController:alert animated:YES completion:nil]; 

在舊UIAlertView,我會的UIAlertViewStylePlainTextInputalertViewStyle標記它。然後,如果用戶打輸入文本後,他們的鍵盤上的「返回」按鈕,UIAlertViewDelegate方法willDismissWithButtonIndex:將與一些buttonIndex(具體取決於UIAlertView已經指定哪些按鈕)調用。

在新UIAlertController,如果用戶點擊「確定」或「取消」按鈕,然後按預期的方式執行其相應的操作;但是如果用戶剛剛擊中鍵盤上的「返回」鍵,它只是隱藏鍵盤,但警報仍保留在屏幕上,並且不執行任何操作。

我想過配置的文本字段設置UITextFieldDelegateself,然後可能重寫textFieldDidReturn:方法,但我也不知道,如果有一種方法來調用UIAlertController的行動程序之一。無論如何,這聽起來有點亂。我錯過了明顯的東西嗎?

+0

我找不到以編程方式觸發動作的方法。多麼疏忽... – elsurudo 2016-02-05 17:36:17

回答

0

在IOS 8.0.2試試這個,它可能有固定的。我的文本字段觸發了默認的「確定」操作,甚至不使用任何委派。

+0

甚至不能在iOS 9.2中工作。這絕對是一個疏忽。 – elsurudo 2016-02-05 17:35:53

1

不是理想的答案,但我最終將我的動作的代碼提取到一個方法中,並簡單地從動作和UITextFieldDelegate中的textFieldDidReturn:方法中調用該方法。

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [textField resignFirstResponder]; 

    [self doAction:textField]; 
    [self dismissViewControllerAnimated:YES completion:NULL]; 

    return NO; 
} 
7

在iOS 9.3上,如果您有UIAlertActionStyleDefault樣式的多個操作,就會發生這種情況。

當您添加與UIAlertActionStyleDefault一個動作和另一個UIAlertActionStyleCancel,默認風格的動作將被稱爲

0

斯威夫特3溶液:

確保你只有一個選擇,因爲.DEFAULT。我還發現,使用一個.default和一個.destructive選項時會出現同樣的不良行爲...不知道爲什麼會發生這種情況。

let cancelAction = UIAlertAction(title: "Discard", style: .cancel) { (_) -> Void in 
      self.invokedPullToAdd = false 
     } 
let submitAction = UIAlertAction(title: "Save", style: .default) { [unowned ac] _ in 
      let answer = ac.textFields![0] 
      if answer.text != "" { 
       self.addItem(name: answer.text!) 
       self.tableView.reloadData() 
      } else { 
       print ("WARNING: No input!") 
      } 
      self.invokedPullToAdd = false 
     } 
-1

您不應該在UIAlertAction中設置兩個「UIAlertActionStyleCancel」。