我将如何在Swift中创build一个UIAlertView?
我一直在努力在Swift中创build一个UIAlertView,但由于某种原因,我无法得到正确的声明,因为我得到这个错误:
无法find接受提供的参数的“init”的重载
这是我写的:
let button2Alert: UIAlertView = UIAlertView(title: "Title", message: "message", delegate: self, cancelButtonTitle: "Ok", otherButtonTitles: nil)
然后调用它我正在使用:
button2Alert.show()
截至目前它正在崩溃,我似乎无法得到正确的语法。
从UIAlertView
类:
// UIAlertView已被弃用。 相反 ,使用UIAlertController和UIAlertControllerStyleAlert的preferredStyle
在iOS 8上,你可以这样做:
let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.Alert) alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil)) self.presentViewController(alert, animated: true, completion: nil)
现在UIAlertController
是一个类,用于在iOS 8上创build和与我们所知的UIAlertView
和UIActionSheet
交互。
编辑:处理操作:
alert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { action in switch action.style{ case .Default: print("default") case .Cancel: print("cancel") case .Destructive: print("destructive") } }))
编辑Swift 3:
let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert) alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil)) self.present(alert, animated: true, completion: nil)
更新了Swift 3
一个button
class ViewController: UIViewController { @IBAction func showAlertButtonTapped(_ sender: UIButton) { // create the alert let alert = UIAlertController(title: "My Title", message: "This is my message.", preferredStyle: UIAlertControllerStyle.alert) // add an action (button) alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)) // show the alert self.present(alert, animated: true, completion: nil) } }
两个button
class ViewController: UIViewController { @IBAction func showAlertButtonTapped(_ sender: UIButton) { // create the alert let alert = UIAlertController(title: "UIAlertController", message: "Would you like to continue learning how to use iOS alerts?", preferredStyle: UIAlertControllerStyle.alert) // add the actions (buttons) alert.addAction(UIAlertAction(title: "Continue", style: UIAlertActionStyle.default, handler: nil)) alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil)) // show the alert self.present(alert, animated: true, completion: nil) } }
三个button
class ViewController: UIViewController { @IBAction func showAlertButtonTapped(_ sender: UIButton) { // create the alert let alert = UIAlertController(title: "Notice", message: "Lauching this missile will destroy the entire universe. Is this what you intended to do?", preferredStyle: UIAlertControllerStyle.alert) // add the actions (buttons) alert.addAction(UIAlertAction(title: "Remind Me Tomorrow", style: UIAlertActionStyle.default, handler: nil)) alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil)) alert.addAction(UIAlertAction(title: "Launch the Missile", style: UIAlertActionStyle.destructive, handler: nil)) // show the alert self.present(alert, animated: true, completion: nil) } }
处理button水龙头
在上面的例子中, handler
是nil
。 当用户点击一个button时,你可以用闭包来replacenil
。 例如:
alert.addAction(UIAlertAction(title: "Launch the Missile", style: UIAlertActionStyle.destructive, handler: { action in // do something like... self.launchMissile() }))
笔记
- 多个button不一定需要使用不同的
UIAlertActionStyle
types。 他们都可以。.default
。 - 对于三个以上的button考虑使用一个操作表。 设置非常相似。 这是一个例子。
你可以使用标准的构造函数创build一个UIAlert,但是“遗留”似乎不起作用:
let alert = UIAlertView() alert.title = "Alert" alert.message = "Here's a message" alert.addButtonWithTitle("Understood") alert.show()
点击查看
@IBAction func testClick(sender: UIButton) { var uiAlert = UIAlertController(title: "Title", message: "Message", preferredStyle: UIAlertControllerStyle.Alert) self.presentViewController(uiAlert, animated: true, completion: nil) uiAlert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { action in println("Click of default button") })) uiAlert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { action in println("Click of cancel button") })) }
用两个button完成并取消
如果您的目标是iOS 7 和 8,则需要类似这样的内容来确保每个版本都使用正确的方法,因为UIAlertView
在iOS 8中不推荐使用,但UIAlertController
在iOS 7中不可用:
func alert(title: String, message: String) { if let getModernAlert: AnyClass = NSClassFromString("UIAlertController") { // iOS 8 let myAlert: UIAlertController = UIAlertController(title: title, message: message, preferredStyle: .Alert) myAlert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) self.presentViewController(myAlert, animated: true, completion: nil) } else { // iOS 7 let alert: UIAlertView = UIAlertView() alert.delegate = self alert.title = title alert.message = message alert.addButtonWithTitle("OK") alert.show() } }
以swift语言显示UIAlertView: –
协议UIAlertViewDelegate
let alert = UIAlertView(title: "alertView", message: "This is alertView", delegate:self, cancelButtonTitle:"Cancel", otherButtonTitles: "Done", "Delete") alert.show()
以swift语言显示UIAlertViewController: –
let alert = UIAlertController(title: "Error", message: "Enter data in Text fields", preferredStyle: UIAlertControllerStyle.Alert) alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) self.presentViewController(alert, animated: true, completion: nil)
只是不要在构造函数中提供otherButtonTitles。
let alertView = UIAlertView(title: "Oops!", message: "Something happened...", delegate: nil, cancelButtonTitle: "OK") alertView.show()
但是我同意奥斯卡,这个类在iOS 8中已经被弃用了,所以如果你正在做一个iOS 8的应用程序,就不会有UIAlertView的使用。 否则上面的代码将工作。
使用Swift 2的协议扩展,您可以创build一个协议,为您的视图控制器提供默认实现:
ShowsAlert.swift
import UIKit protocol ShowsAlert {} extension ShowsAlert where Self: UIViewController { func showAlert(title: String = "Error", message: String) { let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert) alertController.addAction(UIAlertAction(title: "Ok", style: .Default, handler: nil)) presentViewController(alertController, animated: true, completion: nil) } }
ViewController.swift
class ViewController: UIViewController, ShowsAlert { override func viewDidLoad() { super.viewDidLoad() showAlert(message: "Hey there, I am an error message!") } }
我发现这一个,
var alertView = UIAlertView(); alertView.addButtonWithTitle("Ok"); alertView.title = "title"; alertView.message = "message"; alertView.show();
虽然不好,但它的工作:)
更新:
但是我已经在头文件中find了:
extension UIAlertView { convenience init(title: String, message: String, delegate: UIAlertViewDelegate?, cancelButtonTitle: String?, otherButtonTitles firstButtonTitle: String, _ moreButtonTitles: String...) }
有人可以解释这一点。
class Preview: UIViewController , UIAlertViewDelegate { @IBAction func MoreBtnClicked(sender: AnyObject) { var moreAlert=UIAlertView(title: "Photo", message: "", delegate: self, cancelButtonTitle: "No Thanks!", otherButtonTitles: "Save Image", "Email", "Facebook", "Whatsapp" ) moreAlert.show() moreAlert.tag=111; } func alertView(alertView: UIAlertView, didDismissWithButtonIndex buttonIndex: Int) { if alertView.tag==111 { if buttonIndex==0 { println("No Thanks!") } else if buttonIndex==1 { println("Save Image") } else if buttonIndex == 2 { println("Email") } else if buttonIndex == 3 { println("Facebook") } else if buttonIndex == 4 { println("Whatsapp") } } } }
我有另一个窍门。 假设你有5个类,其中应用了注销警报。 尝试快速类扩展。
文件 – 新 – Swift类 – 命名它。
添加以下内容:
public extension UIViewController { func makeLogOutAlert() { var refreshAlert = UIAlertController(title: "Log Out", message: "Are You Sure to Log Out ? ", preferredStyle: UIAlertControllerStyle.Alert) refreshAlert.addAction(UIAlertAction(title: "Confirm", style: .Default, handler: { (action: UIAlertAction!) in self.navigationController?.popToRootViewControllerAnimated(true) })) refreshAlert.addAction(UIAlertAction(title: "Cancel", style: .Default, handler: { (action: UIAlertAction!) in refreshAlert .dismissViewControllerAnimated(true, completion: nil) })) presentViewController(refreshAlert, animated: true, completion: nil) } }
实现使用:self.makeLogOutAlert()。 希望它有帮助。
Swift 3
以下是如何使用Swift 3创build一个简单的警报的简单示例。
let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Ok", style: .default)) present(alert, animated: true)
在上面的例子中,动作的句柄callback已被省略,因为单击button时,具有一个button的警报视图的默认行为将消失。
以下是如何创build另一个操作,可以通过“alert.addAction(action)”添加到警报中。 不同的风格是.default,.destructive和.cancel。
let action = UIAlertAction(title: "Ok", style: .default) { action in // Handle when button is clicked }
我得到了下面的UIAlertView
初始化代码来编译没有错误(我最后,不同的部分可能是棘手)。 但是我必须确定自己的类(我作为委托传递)采用UIAlertViewDelegate
协议来编译错误消失:
let alertView = UIAlertView( title: "My Title", message: "My Message", delegate: self, cancelButtonTitle: "Cancel", otherButtonTitles: "OK" )
顺便说一句,这是我得到的错误(从Xcode 6.4):
找不到types为“UIAlertView”的初始化工具,它接受types为“(title:String,message:String,delegate:MyViewController,cancelButtonTitle:String,otherButtonTitles:String)”的参数列表
正如其他人所提到的,如果你的目标是iOS 8.x +,你应该迁移到UIAlertController。 要支持iOS 7,请使用上面的代码(Swift不支持iOS 6)。
我已经做了一个单身人士课程,以方便您在应用程序的任何地方使用: https : //github.com/Swinny1989/Swift-Popups
然后,您可以创build一个popup式多个button,如下所示:
Popups.SharedInstance.ShowAlert(self, title: "Title goes here", message: "Messages goes here", buttons: ["button one" , "button two"]) { (buttonPressed) -> Void in if buttonPressed == "button one" { //Code here } else if buttonPressed == "button two" { // Code here } }
或popup一个单一的button,如下所示:
Popups.SharedInstance.ShowPopup("Title goes here", message: "Message goes here.")
它不工作的原因,因为你传递给函数的一些值是不正确的。 swift不喜欢Objective-C,你可以把nil作为没有任何限制的类types的参数(可能是)。 参数otherButtonTitles被定义为它的types在其末尾没有(?)的非可选项。 所以你必须传递一个具体的价值。
@IBAction func Alert(sender: UIButton) { var alertView:UIAlertView = UIAlertView() alertView.title = "Alert!" alertView.message = "Message" alertView.delegate = self alertView.addButtonWithTitle("OK") alertView.show() }
尝试这个
使用此代码显示一个alertview
let alertController = UIAlertController(title: "Hello Coders", message: "your alert message", preferredStyle: .Alert) let defaultAction = UIAlertAction(title: "Close Alert", style: .Default, handler: nil) alertController.addAction(defaultAction) presentViewController(alertController, animated: true, completion: nil)
参考: 使用UIAlertController的Swift Show Alert
Swift中有一个有趣的例子:
private func presentRandomJoke() { if let randomJoke: String = jokesController.randomJoke() { let alertController: UIAlertController = UIAlertController(title:nil, message:randomJoke, preferredStyle: UIAlertControllerStyle.Alert) alertController.addAction(UIAlertAction(title:"Done", style:UIAlertActionStyle.Default, handler:nil)) presentViewController(alertController, animated:true, completion:nil) } }
这是Swift中一个非常简单的AlertView函数:
class func globalAlertYesNo(msg: String) { let alertView = UNAlertView(title: "Title", message: msg) alertView.messageAlignment = NSTextAlignment.Center alertView.buttonAlignment = UNButtonAlignment.Horizontal alertView.addButton("Yes", action: { print("Yes action") }) alertView.addButton("No", action: { print("No action") }) alertView.show() }
您必须在使用此function的地方将消息作为string传递。
旧方法:UIAlertView
let alertView = UIAlertView(title: "Default Style", message: "A standard alert.", delegate: self, cancelButtonTitle: "Cancel", otherButtonTitles: "OK") alertView.alertViewStyle = .Default alertView.show() // MARK: UIAlertViewDelegate func alertView(alertView: UIAlertView, clickedButtonAtIndex buttonIndex: Int) { switch buttonIndex { // ... } }
新方法:UIAlertController
let alertController = UIAlertController(title: "Default Style", message: "A standard alert.", preferredStyle: .Alert) let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (action) in // ... } alertController.addAction(cancelAction) let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in // ... } alertController.addAction(OKAction) self.presentViewController(alertController, animated: true) { // ... }
在xcode 9
let alert = UIAlertController(title: "Alert", message: "message", preferredStyle: UIAlertControllerStyle.alert) alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)) self.present(alert, animated: true, completion: nil)