我尝试使用iOS 8 UIAlertController
代替我过去使用UIAlertView
的地方。我希望用户能够在此警报中输入文本并点击" OK"处理文本或"取消"取消。
这是基本代码:
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
,我会使用alertViewStyle
UIAlertViewStylePlainTextInput
对其进行标记。然后,如果用户点击"返回"输入文本后键盘上的按钮,UIAlertViewDelegate方法willDismissWithButtonIndex:
将被调用一些buttonIndex
(取决于UIAlertView
中指定的按钮)。
在新的UIAlertController
中,如果用户点按了" OK"或"取消"按钮,然后按预期执行相应的操作;但如果用户只是点击"返回"键盘上的键,它只是隐藏键盘,但警报仍保留在屏幕上,不执行任何操作。
我考虑过配置文本字段以将UITextFieldDelegate
设置为self
,然后可能会覆盖textFieldDidReturn:
方法,但我也不知道如果有办法以编程方式调用其中一个UIAlertController
的操作。无论如何,这听起来有点混乱/ hacky。我错过了一些明显的东西吗?
答案 0 :(得分:9)
在iOS 9.3上,如果您有多个UIAlertActionStyleDefault
样式的操作,就会发生这种情况。
当您使用UIAlertActionStyleDefault
添加一个操作而使用UIAlertActionStyleCancel
添加另一个操作时,将调用默认样式的操作
答案 1 :(得分:1)
不是理想的答案,但我最终将我的操作代码提取到一个方法中,只需从textFieldDidReturn:
中的操作和UITextFieldDelegate
方法中调用该方法。 / p>
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
[self doAction:textField];
[self dismissViewControllerAnimated:YES completion:NULL];
return NO;
}
答案 2 :(得分:0)
在iOS 8.0.2中试试这个,它可能已修复它。我的文本字段触发了默认的“OK”操作,甚至没有使用任何委托。
答案 3 :(得分:0)
Swift 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
}
答案 4 :(得分:0)
这是一个古老的问题,但是自从iOS9以来,一直存在一个简单的解决方案,但我没有在此处列出,因此希望这会对其他人有所帮助。
的确,当您执行多个UIAlertActionStyleDefault
操作时,当用户按下UITextField
中的Enter键时,系统无法选择要触发的操作。
但是,您可以在UIAlertController上设置preferredAction
属性来对此进行补救。
因此:
myAlertController.preferredAction = myDefaultAction;
现在在UITextField中按Enter键将触发您选择的UIAlertAction。
答案 5 :(得分:-1)
你不应该设置两个" UIAlertActionStyleCancel"在UIAlertAction。