2014-09-25 48 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”。