在哪里可以找到有关Swift警报(UIAlertController)的清晰解释?
UIAlertController是iOS开发中用于显示提示框或者操作表的类,它可以通过调用presentViewController:animated:completion:方法以模态的方式展示在屏幕上。UIAlertController的样式取决于在创建时传递的参数,可以是ActionSheet或者AlertView。
与之前的UIActionSheet和UIAlertView不同的是,UIAlertController不再使用委托模式来获取回调。之前的委托模式需要在类中实现UIActionSheetDelegate或者UIAlertViewDelegate协议来处理用户的操作。虽然有一些开源项目已经使用基于闭包(或者Objective-C中的block)的回调方式替代了委托模式,但是官方的API并没有更新。UIAlertController使用了一组UIAlertAction实例来处理用户的操作,而这些UIAlertAction实例使用闭包处理用户的输入。
如果要创建一个ActionSheet样式的UIAlertController,可以使用以下代码:
func showActionSheet(sender: AnyObject) {
let actionSheetController: UIAlertController = UIAlertController(title: "Action Sheet", message: "Swiftly Now! Choose an option!", preferredStyle: .ActionSheet)
let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
// Just dismiss the action sheet
}
actionSheetController.addAction(cancelAction)
let takePictureAction: UIAlertAction = UIAlertAction(title: "Take Picture", style: .Default) { action -> Void in
// Code for launching the camera goes here
}
actionSheetController.addAction(takePictureAction)
let choosePictureAction: UIAlertAction = UIAlertAction(title: "Choose From Camera Roll", style: .Default) { action -> Void in
// Code for picking from camera roll goes here
}
actionSheetController.addAction(choosePictureAction)
self.presentViewController(actionSheetController, animated: true, completion: nil)
}
如果要创建一个带有文本框的AlertView样式的UIAlertController,可以使用以下代码:
func showAlert(sender: AnyObject) {
let actionSheetController: UIAlertController = UIAlertController(title: "Alert", message: "Swiftly Now! Choose an option!", preferredStyle: .Alert)
let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
// Do some stuff
}
actionSheetController.addAction(cancelAction)
let nextAction: UIAlertAction = UIAlertAction(title: "Next", style: .Default) { action -> Void in
// Do some other stuff
}
actionSheetController.addAction(nextAction)
actionSheetController.addTextFieldWithConfigurationHandler { textField -> Void in
textField.textColor = UIColor.blueColor()
}
self.presentViewController(actionSheetController, animated: true, completion: nil)
}
以上就是关于如何使用UIAlertController来显示提示框或者操作表的解释。在使用UIAlertController时,不再需要使用委托模式来获取用户的操作,而是使用闭包来处理用户的输入。
问题的原因是因为在原始的回答中,代码的语法已经发生了变化。解决方法是使用更新后的代码来实现警告框。以下是一个示例代码,用于在用户未登录到iCloud时向其发出警告。
CKContainer.default().accountStatus { (accountStatus, error) in
switch accountStatus {
case .available:
print("iCloud 可用")
case .noAccount:
print("没有iCloud账号")
// 创建简单的警告对话框
let alert = UIAlertController(title: "登录iCloud", message: "该应用程序需要iCloud。请登录您的iCloud账号以写入记录。在主屏幕上,启动“设置”,点击“iCloud”,并输入您的Apple ID。打开iCloud Drive。如果您没有iCloud账号,请点击“创建新的Apple ID”", preferredStyle: UIAlertController.Style.alert)
// 添加事件处理程序(仅关闭对话框)
alert.addAction(UIAlertAction(title: "取消", style: UIAlertAction.Style.cancel, handler: nil))
// 显示警告框
self.present(alert, animated: true, completion: nil)
case .restricted:
print("iCloud 受限")
case .couldNotDetermine:
print("无法确定iCloud状态")
}
}
以上代码会检查iCloud的账户状态,并根据不同的状态给出相应的响应和警告。如果用户未登录到iCloud,将会弹出一个警告框,提示用户登录iCloud账号以使用该应用程序的功能。
在我搜索了一段时间后,我没有找到一个清晰的解释,即使在它的类参考中也是如此。虽然它可以使用,但对我来说不够清楚。所以在收集了一些信息后,我决定自己解释一下(希望能有所帮助)。下面是解释:
1. `UIAlertView` 已经被弃用,如下所指出:UIAlertView in Swift
2. 在iOS8及以上版本中应该使用 `UIAlertController`,所以首先我们需要实例化它,构造函数(init)有三个参数:
2.1 title:String -> 在对话框顶部显示的粗体文本
2.2 message:String -> 较小的文本(几乎可以解释自己)
2.3 `prefferedStyle:UIAlertControllerStyle` -> 定义对话框的样式,在大多数情况下为 `UIAlertControllerStyle.Alert`
3. 现在我们可以使用`showViewController` 或 `presentViewController` 来将它显示给用户,并将我们的警告作为参数传递
4. 我们可以使用以下方法与用户进行交互:
4.1 `UIAlertController.addAction` 来创建按钮
4.2 `UIAlertController.addTextField` 来创建文本字段
以下是一些代码示例:
示例1:简单的对话框
func alert1(sender: UIButton) {
//简单的对话框
let alert=UIAlertController(title: "Alert 1", message: "One has won", preferredStyle: UIAlertControllerStyle.alert);
//显示对话框
show(alert, sender: self);
}
示例2:带有一个输入文本字段和两个按钮的对话框
func alert2(sender: UIButton) {
//带有一个输入文本字段和两个按钮的对话框
let alert=UIAlertController(title: "Alert 2", message: "Two will win too", preferredStyle: UIAlertControllerStyle.alert);
//默认的输入文本字段(没有配置...)
alert.addTextField(configurationHandler: nil);
//没有事件处理程序(只是关闭对话框)
alert.addAction(UIAlertAction(title: "No", style: UIAlertActionStyle.cancel, handler: nil));
//带有闭包的事件处理程序
alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.default, handler: {(action:UIAlertAction) in
let fields = alert.textFields!;
print("Yes we can: "+fields[0].text!);
}));
present(alert, animated: true, completion: nil);
}
示例3:带有自定义输入文本字段和一个按钮的对话框
func alert3(sender: UIButton) {
//一个输入文本字段和一个按钮
let alert=UIAlertController(title: "Alert 3", message: "Three will set me free", preferredStyle: UIAlertControllerStyle.alert);
//配置的输入文本字段
var field:UITextField?;//使用?运算符,因为它稍后初始化
alert.addTextField(configurationHandler:{(input:UITextField)in
input.placeholder="I am displayed, when there is no value ;-)";
input.clearButtonMode=UITextFieldViewMode.whileEditing;
field=input;//将其分配给外部变量(供以后引用)
});
//alert3的事件处理程序(在与警告同一范围内定义,并作为事件处理程序传递)
func yesHandler(actionTarget: UIAlertAction){
print("YES -> !!");
//从'relevant input'中打印文本
print(field!.text!);//使用!运算符,因为此处是可选的
}
//带有预定义函数的事件处理程序
alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.default, handler: yesHandler));
present(alert, animated: true, completion: nil);
}
希望这对你有所帮助,祝你好运!