如何在Swift中创建UIAlertView?


481

我一直在努力在Swift中创建UIAlertView,但是由于某种原因,由于出现此错误,我无法正确执行该语句:

找不到接受提供的参数的'init'的重载

这是我的写法:

let button2Alert: UIAlertView = UIAlertView(title: "Title", message: "message",
                     delegate: self, cancelButtonTitle: "OK", otherButtonTitles: nil)

然后调用它,我正在使用:

button2Alert.show()

截至目前,它崩溃了,我似乎无法正确理解语法。


5
UIAlertViewUIActionSheetUIAlertController在iOS 8中被替换,您看到了吗?
Popeye

确保self所属的类采用协议UIAlertViewDelegate(在Swift中,建议的扩展方式是使用扩展名)。
Nicolas Miari

@Adam:我已经回复了您的重新标记。该swift3标记是“直接关系到苹果的雨燕编程语言的版本3的改变的问题。” 而且我不认为“如果答案清楚表明问题中的问题是由提问者所想之外的其他原因引起的,则重新标记非常有帮助。” meta.stackoverflow.com/questions/252079/…此处适用。
Martin R

1
@MartinR我不知道如何更新问题以表明有答案适用于当前版本的Swift;这里有很多旧的无用的东西,[swift]会发现所有有用的东西。我对还原此重新标记并不感到强烈,但我希望有一种确定的方法来解决此问题。(我希望答案有标签。)
亚当·埃伯巴赫

Answers:


897

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上与UIAlertViews和UIActionSheets 进行创建和交互的单一类。

编辑:处理动作:

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 4.x编辑:

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: .alert)
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")


}}))
self.present(alert, animated: true, completion: nil)

3
您在哪里看到不推荐使用UIAlertView?我在文档中看不到吗?
BlueBear 2014年

9
Cmd +单击UIAlertView类,注释就在类声明的顶部。
奥斯卡·斯旺罗斯

2
我会向其他好奇的人回答我自己的问题。alert.addAction(UIAlertAction(title:“ Cancel”,style:UIAlertActionStyle.Cancel,handler:{(ACTION:UIAlertAction!)in}))
altyus

5
取消和破坏性案例的意义何在,因为它始终是您指定的内容.Default
2014年

4
这个答案就不用做开关了。仅当类型或标题未进行硬编码(即它们是动态的)时,此开关才有用:您可能具有一系列动态按钮,因此标题未进行硬编码。然后,处理程序可能需要将选定的标题传递给其他方法调用
Honey,

465

一键式

一键截图

class ViewController: UIViewController {

    @IBAction func showAlertButtonTapped(_ sender: UIButton) {

        // create the alert
        let alert = UIAlertController(title: "My Title", message: "This is my message.", preferredStyle: UIAlertController.Style.alert)

        // add an action (button)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))

        // show the alert
        self.present(alert, animated: true, completion: nil)
    }
}

两个按钮

两键警报截图

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: UIAlertController.Style.alert)

        // add the actions (buttons)
        alert.addAction(UIAlertAction(title: "Continue", style: UIAlertAction.Style.default, handler: nil))
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil))

        // show the alert
        self.present(alert, animated: true, completion: nil)
    }
}

三个按钮

在此处输入图片说明

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: UIAlertController.Style.alert)

        // add the actions (buttons)
        alert.addAction(UIAlertAction(title: "Remind Me Tomorrow", style: UIAlertAction.Style.default, handler: nil))
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil))
        alert.addAction(UIAlertAction(title: "Launch the Missile", style: UIAlertAction.Style.destructive, handler: nil))

        // show the alert
        self.present(alert, animated: true, completion: nil)
    }
}

处理按钮水龙头

handlernil在上述实施例。您可以nil闭包代替当用户点击按钮时执行的操作。例如:

alert.addAction(UIAlertAction(title: "Launch the Missile", style: UIAlertAction.Style.destructive, handler: { action in

    // do something like...
    self.launchMissile()

}))

笔记

  • 多个按钮不一定需要使用不同的UIAlertAction.Style类型。他们可能都是.default
  • 对于三个以上的按钮,请考虑使用操作表。设置非常相似。这是一个例子。

2
UIAlertController中是否有任何委托属性?在UIAlertView中有一个委托属性,我们有时将其设置为self,UIAlertController中是否没有类似的东西?我是
新手

漂亮的答案-现在我们如何在处理程序中切换到新视图?
That1Guy

114

您可以使用标准构造函数创建UIAlert,但“旧版”似乎不起作用:

let alert = UIAlertView()
alert.title = "Alert"
alert.message = "Here's a message"
alert.addButtonWithTitle("Understood")
alert.show()

8
不推荐使用UIAlertView。改用UIAlertController和UIAlertControllerStyleAlert的preferredStyle。
Zorayr 2015年

16
@Zorayr UIAlertController仅可从iOS 8开始使用,建议使用时也请提及。在某些情况下,仍然需要iOS7支持,人们可能会错过此问题。弃用并不意味着“不再使用它”。
Sami Kuhmonen

2
如果您的应用仍针对iOS 7,则此方法有效。但是,理想情况下,仅应在UIAlertController不可用时使用UIAlertView。如果NSClassFromString(“ UIAlertController”)!= nil {/ *使用UIAlertController * /} else {/ *使用UIAlertView * /}
phatblat

UIAlertview()现在已在iOS 9中弃用
Rizwan Ahmed

31

在Swift 4.2和Xcode 10中

方法1:

简单提醒

let alert = UIAlertController(title: "Your title", message: "Your message", preferredStyle: .alert)

     let ok = UIAlertAction(title: "OK", style: .default, handler: { action in
     })
     alert.addAction(ok)
     let cancel = UIAlertAction(title: "Cancel", style: .default, handler: { action in
     })
     alert.addAction(cancel)
     DispatchQueue.main.async(execute: {
        self.present(alert, animated: true)
})

方法2:

共享类警报

如果您想使用共享类样式(每次写入一次,请在任何地方使用)

import UIKit
class SharedClass: NSObject {//This is shared class
static let sharedInstance = SharedClass()

    //Show alert
    func alert(view: UIViewController, title: String, message: String) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
        })
        alert.addAction(defaultAction)
        DispatchQueue.main.async(execute: {
            view.present(alert, animated: true)
        })
    }

    private override init() {
    }
}

现在在每个商品中都这样调用警报

SharedClass.SharedInstance.alert(view: self, title: "Your title here", message: "Your message here")

方法3:

当前所有Windows的警报顶部

如果要在所有视图之上显示警报,请使用此代码

func alertWindow(title: String, message: String) {
    DispatchQueue.main.async(execute: {
        let alertWindow = UIWindow(frame: UIScreen.main.bounds)
        alertWindow.rootViewController = UIViewController()
        alertWindow.windowLevel = UIWindowLevelAlert + 1

        let alert2 = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let defaultAction2 = UIAlertAction(title: "OK", style: .default, handler: { action in
        })
        alert2.addAction(defaultAction2)

        alertWindow.makeKeyAndVisible()

        alertWindow.rootViewController?.present(alert2, animated: true, completion: nil)
    })
}

函数调用

SharedClass.sharedInstance.alertWindow(title:"This your title", message:"This is your message")

方法4:

扩展警报

extension  UIViewController {

    func showAlert(withTitle title: String, withMessage message:String) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let ok = UIAlertAction(title: "OK", style: .default, handler: { action in
        })
        let cancel = UIAlertAction(title: "Cancel", style: .default, handler: { action in
        })
        alert.addAction(ok)
        alert.addAction(cancel)
        DispatchQueue.main.async(execute: {
            self.present(alert, animated: true)
        })
    }
}

现在这样打电话

//Call showAlert function in your class
@IBAction func onClickAlert(_ sender: UIButton) {
    showAlert(withTitle:"Your Title Here", withMessage: "YourCustomMessageHere")
}

方法5:

文本提示

如果要添加文本字段以发出警报。

//Global variables
var name:String?
var login:String?

//Call this function like this:  alertWithTF() 
//Add textfields to alert 
func alertWithTF() {

    let alert = UIAlertController(title: "Login", message: "Enter username&password", preferredStyle: .alert)
    // Login button
    let loginAction = UIAlertAction(title: "Login", style: .default, handler: { (action) -> Void in
        // Get TextFields text
        let usernameTxt = alert.textFields![0]
        let passwordTxt = alert.textFields![1]
        //Asign textfileds text to our global varibles
        self.name = usernameTxt.text
        self.login = passwordTxt.text

        print("USERNAME: \(self.name!)\nPASSWORD: \(self.login!)")
    })

    // Cancel button
    let cancel = UIAlertAction(title: "Cancel", style: .destructive, handler: { (action) -> Void in })

    //1 textField for username
    alert.addTextField { (textField: UITextField) in
        textField.placeholder = "Enter username"
        //If required mention keyboard type, delegates, text sixe and font etc...
        //EX:
        textField.keyboardType = .default
    }

    //2nd textField for password
    alert.addTextField { (textField: UITextField) in
        textField.placeholder = "Enter password"
        textField.isSecureTextEntry = true
    }

    // Add actions
    alert.addAction(loginAction)
    alert.addAction(cancel)
    self.present(alert, animated: true, completion: nil)

}

方法6:

带有扩展名的SharedClass中的警报

//This is your shared class
import UIKit

 class SharedClass: NSObject {

 static let sharedInstance = SharedClass()

 //Here write your code....

 private override init() {
 }
}

//Alert function in shared class
extension UIViewController {
    func showAlert(title: String, msg: String) {
        DispatchQueue.main.async {
            let alert = UIAlertController(title: title, message: msg, preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    }
}

现在像这样直接打电话

self.showAlert(title: "Your title here...", msg: "Your message here...")

方法7:

没有共享类的警报,带有扩展的单独类中的警报。

创建一个新的Swift类,然后import UIKit。复制并粘贴以下代码。

//This is your Swift new class file
import UIKit
import Foundation

extension UIAlertController {
    class func alert(title:String, msg:String, target: UIViewController) {
        let alert = UIAlertController(title: title, message: msg, preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default) {
        (result: UIAlertAction) -> Void in
        })
        target.present(alert, animated: true, completion: nil)
    }
}

现在在您所有的类中调用警报功能(单行)。

UIAlertController.alert(title:"Title", msg:"Message", target: self)

如何....


完美!+1您能否添加一个带有集成超时的方法?谢谢!
PascalS

@ Passe,对不起,我听不懂,请简要解释一下。
iOS

我需要显示一个alertController,直到单击“确定”按钮或发生超时为止。类似于方法6或7,但具有附加的输入变量“超时”。
PascalS

扩展UIViewController {func alertWithTime(title:String,msg:String,timeInterval:TimeInterval){DispatchQueue.main.async {let alert = UIAlertController(title:title,message:msg,preferredStyle:.alert)alert.addAction(UIAlertAction(title :“确定”,样式:.default,处理程序:nil))self.present(警报,动画:true,完成:nil)如果#available(iOS 10.0,*){Timer.scheduledTimer(withTimeInterval:timeInterval,重复:false ,阻止:{_ in alert.dismiss(动画:true,完成:nil)})}其他{//早期版本的回退}}}}
iOS

1
如果您不想关闭警报,那么在这种情况下如果提到timeInterval 0,请使用if条件。 if timeInterval != 0 { if #available(iOS 10.0, *) { Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: false, block: { _ in alert.dismiss(animated: true, completion: nil) }) } else { // Fallback on earlier versions } }
iOS

19

点击查看

@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")
  }))

}

完成两个按钮,确定并取消


12

如果您的目标是iOS 7 8,则需要类似以下内容来确保对每个版本使用正确的方法,因为UIAlertViewiOS 8中已弃用该方法,但UIAlertControlleriOS 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()
    }
}

或者,您可以节省时间并只使用它,UIAlertView直到放弃对iOS 7的支持。Apple不会为此拒绝您的应用程序。
cprcrack

2
弃用并不意味着“不要使用它”,也不意味着它是“错误的方法”,而只是意味着以后将无法使用。如果仅需要基本警报,则无需在iOS8上专门使用UIAlertController。他们将像以前一样工作。有许多API在iOS4或5中已弃用,但仍可在iOS8中使用。但是,当然,定位于更高iOS级别的应用程序不应使用它们,这就是为什么出现过时警告的原因。
Sami Kuhmonen 2015年

1
@SamiKuhmonen否,但是它可以更清楚地说明为什么要执行自己的工作,并且当最低版本足够高时,可以更轻松地删除对不赞成使用的方法的支持。
AstroCB 2015年

12

借助Swift 2的协议扩展,您可以创建一个为视图控制器提供默认实现的协议:

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!")
    }
}

1
完美运作。对于Swift3,将“ presentViewController”更改为“ present”。
Vincent

11

快速显示UIAlertView:-

协议UIAlertViewDelegate

let alert = UIAlertView(title: "alertView", message: "This is alertView", delegate:self, cancelButtonTitle:"Cancel", otherButtonTitles: "Done", "Delete")
alert.show()

快速显示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)

11

只是不要在构造函数中提供otherButtonTitles。

let alertView = UIAlertView(title: "Oops!", message: "Something
happened...", delegate: nil, cancelButtonTitle: "OK")

alertView.show()

但是我确实同意Oscar的观点,该类在iOS 8中已被弃用,因此,如果您使用的是仅限iOS 8的应用程序,则不会使用UIAlertView。否则,上面的代码将起作用。


9

我找到了这个

var alertView = UIAlertView();
alertView.addButtonWithTitle("Ok");
alertView.title = "title";
alertView.message = "message";
alertView.show();

虽然不好,但是可以用:)

更新:

但我发现头文件为:

extension UIAlertView {
    convenience init(title: String, message: String, delegate: UIAlertViewDelegate?, cancelButtonTitle: String?, otherButtonTitles firstButtonTitle: String, _ moreButtonTitles: String...)
}

有人可以解释一下。


显然,UIAlertView在iOS 8中已被弃用,我们现在将UIAlertController与UIAlertControllerStyleAlert的首选样式一起使用。
BlueBear 2014年

6
如果您运行的应用程序需要向后兼容iOS7.1,并使用Swift进行编写,则UIAlertController会导致目标设备崩溃。您需要支持iOS7的旧版UIAlertViews。
2014年

我认为,这不是斯威夫特会导致崩溃,而是一个事实,即UIAlertController不可用的iOS 8之前
弗雷德里克·阿达

7

我认为,对于SWIFT4,扩展UIViewController和创建可重用的确认控件是最优雅的方法。

您可以UIViewController如下扩展:

extension UIViewController {

func AskConfirmation (title:String, message:String, completion:@escaping (_ result:Bool) -> Void) {
    let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)
    self.present(alert, animated: true, completion: nil)

    alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: { action in
        completion(true)
    }))

    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { action in
        completion(false)
    }))
  }
}

然后,您可以随时使用它:

 AskConfirmation(title: "YOUR MESSAGE TITLE", message: "YOUR MESSAGE") { (result) in
        if result { //User has clicked on Ok

        } else { //User has clicked on Cancel

        }
    }

5
    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")
                }
            }
        }
    }

仅编写大量代码不是很有用。回答任何问题时(尤其是一个古老的问题,有几个答案,包括一个已接受的答案),请编写一段以上的代码。请添加代码说明,代码如何回答问题以及与其他答案有何不同(或更好)的说明。
AdrianHHH 2015年

5

我还有另一个把戏。假设您有5个要应用注销警报的类。尝试使用快速的类扩展。

File- New- Swift class-命名。

添加以下内容:

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()实施。希望能帮助到你。


5

我创建了一个singleton类,以使其在您的应用程序中的任何位置均可方便使用: https //github.com/Swinny1989/Swift-Popups

然后,您可以创建带有多个按钮的弹出窗口,如下所示:

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
    }
}

或带有单个按钮的弹出窗口,如下所示:

Popups.SharedInstance.ShowPopup("Title goes here", message: "Message goes here.")

谢谢。我在那里提交了一些问题
djdance,2016年

1
嘿@ Swinny89非常感谢您与我们分享此解决方案!我被关闭问题卡住了,而你救了我!
布鲁诺·坎波斯

5

迅捷3

以下是一个简单示例,说明如何使用Swift 3的一个按钮创建简单的警报。

let alert = UIAlertController(title: "Title",
                              message: "Message",
                              preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .default))
present(alert, animated: true)

在上面的示例中,省略了该动作的句柄回调,因为单击一个按钮时,带有一个按钮的警报视图的默认行为将消失。

这是创建另一个动作的方法,可以使用“ alert.addAction(action)”将其添加到警报中。不同的样式是.default,.destructive和.cancel。

let action = UIAlertAction(title: "Ok", style: .default) { action in
    // Handle when button is clicked    
}

4

我得到了以下UIAlertView初始化代码,没有错误进行编译(我想说的是,最后,可变部分可能很棘手)。但是我必须确保self(我作为代表传递的)类正在采用UIAlertViewDelegate协议以使编译错误消失:

let alertView = UIAlertView(
                  title: "My Title",
                  message: "My Message",
                  delegate: self,
                  cancelButtonTitle: "Cancel",
                  otherButtonTitles: "OK"
                )

顺便说一句,这是我得到的错误(从Xcode 6.4开始):

找不到类型为'UIAlertView'的初始化程序,该初始化程序接受类型为'(title:字符串,消息:字符串,委托:MyViewController,cancelButtonTitle:字符串,otherButtonTitles:字符串)'的参数列表

如其他人所述,如果可以针对iOS 8.x +,则应迁移到UIAlertController。要支持iOS 7,请使用上面的代码(Swift不支持iOS 6)。


4
 let alertController = UIAlertController(title: "Select Photo", message: "Select atleast one photo", preferredStyle: .alert)
    let action1 = UIAlertAction(title: "From Photo", style: .default) { (action) in
        print("Default is pressed.....")
    }
    let action2 = UIAlertAction(title: "Cancel", style: .cancel) { (action) in
        print("Cancel is pressed......")
    }
    let action3 = UIAlertAction(title: "Click new", style: .default) { (action) in
        print("Destructive is pressed....")

    }
    alertController.addAction(action1)
    alertController.addAction(action2)
    alertController.addAction(action3)
    self.present(alertController, animated: true, completion: nil)

}

4

您可以将此简单扩展名与n个按钮以及相关的动作swift4及更高版本一起使用

extension UIViewController {
    func popupAlert(title: String?, message: String?, actionTitles:[String?], actions:[((UIAlertAction) -> Void)?]) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        for (index, title) in actionTitles.enumerated() {
            let action = UIAlertAction(title: title, style: .default, handler: actions[index])
            alert.addAction(action)
        }
        self.present(alert, animated: true, completion: nil)
    }
}

您可以像这样使用它,

self.popupAlert(title: "Message", message: "your message", actionTitles: ["first","second","third"], actions:[
            {action1 in
                //action for first btn click
            },
            {action2 in
                //action for second btn click
            },
            {action3 in
                //action for third btn click
            }, nil]) 

您请勿发布重复的答案。如果要编辑答案。
iOS

极好的答案。这就是我所需要的。谢谢!
格雷戈里·威尔逊Pullyattu

3

由于传递给该函数的某些值不正确,导致它不起作用的原因。swift不喜欢Objective-C,您可以将nil用作类类型的参数而不受任何限制(可能是)。参数otherButtonTitles定义为非可选的,其类型末尾没有(?)。因此您必须传递一个具体的价值。


3
@IBAction func Alert(sender: UIButton) {

    var alertView:UIAlertView = UIAlertView()
    alertView.title = "Alert!"
    alertView.message = "Message"
    alertView.delegate = self
    alertView.addButtonWithTitle("OK")

    alertView.show()

}

尝试这个


3

使用此代码显示警报视图

  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


3

在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)

3

SWIFT 4:只需创建UIViewController的扩展,如下所示:

extension  UIViewController {        
    func showSuccessAlert(withTitle title: String, andMessage message:String) {
        let alert = UIAlertController(title: title, message: message,
                                  preferredStyle: UIAlertController.Style.alert)
        alert.addAction(UIAlertAction(title: "OK".localized, style:
        UIAlertAction.Style.default, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }
}

现在,在您的ViewController中,直接调用上面的函数,就好像它们是由UIViewController提供的一样。

    yourViewController.showSuccessAlert(withTitle: 
      "YourTitle", andMessage: "YourCustomTitle")

通常,如果答案包括对代码意图的解释,以及为什么不引入其他代码就能解决问题的原因,则答案会更有帮助。感谢您提高答案的参考价值并使其更易于理解!
蒂姆·迪克曼

2

尝试这个。将波纹管代码放入按钮。

let alert = UIAlertController(title: "Your_Title_Text", message: "Your_MSG", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Your_Text", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated:true, completion: nil)

1

这是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)
  }
}

1

这是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()

    }

您必须在使用此函数的地方将消息作为字符串传递。


1

旧方法: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) {
 // ...
}

1

在IOS 9上,您可以执行此操作

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)

1

// UIAlertView的通用类

//MARK:- MODULES
import Foundation
import UIKit

//MARK:- CLASS
class Alert  : NSObject{

static let shared = Alert()

var okAction : AlertSuccess?
typealias AlertSuccess = (()->())?
var alert: UIAlertController?

/** show */
public func show(title : String?, message : String?, viewController : UIViewController?, okAction : AlertSuccess = nil) {

    let version : NSString = UIDevice.current.systemVersion as NSString
    if  version.doubleValue >= 8 {
        alert = UIAlertController(title: title, message: message, preferredStyle:.alert)
        alert?.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action: UIAlertAction) in

            if let okAction = okAction {
                okAction()
            }
        }))
        viewController?.present(alert ?? UIAlertController(), animated:true, completion:nil);
    }
}

/** showWithCancelAndOk */
public func showWithCancelAndOk(title : String, okTitle : String, cancelTitle : String, message : String, viewController : UIViewController?, okAction : AlertSuccess = nil, cancelAction : AlertSuccess = nil) {
    let version:NSString = UIDevice.current.systemVersion as NSString;

    if  version.doubleValue >= 8 {
        alert = UIAlertController(title: title, message: message, preferredStyle:.alert)

        alert?.addAction(UIAlertAction(title: cancelTitle, style: .default, handler: { (action: UIAlertAction) in

            if let cancelAction = cancelAction {
                cancelAction()
            }
        }))
        alert?.addAction(UIAlertAction(title: okTitle, style: .default, handler: { (action: UIAlertAction) in

            if let okAction = okAction {
                okAction()
            }
        }))
        viewController?.present(alert!, animated:true, completion:nil);
    }
}

/** showWithTimer */
public func showWithTimer(message : String?, viewController : UIViewController?) {

    let version : NSString = UIDevice.current.systemVersion as NSString
    if  version.doubleValue >= 8 {
        alert = UIAlertController(title: "", message: message, preferredStyle:.alert)
        viewController?.present(alert ?? UIAlertController(), animated:true, completion:nil)
        let when = DispatchTime.now() + 1
        DispatchQueue.main.asyncAfter(deadline: when){
            self.alert?.dismiss(animated: true, completion: nil)
        }
    }
}
}

采用:-

Alert.shared.show(title: "No Internet Connection", message: "The internet connection appers to be offline.", viewController: self) //without ok action

Alert.shared.show(title: "No Internet Connection", message: "The internet connection appers to be offline.", viewController: self, okAction: {
                            //ok action
                        }) // with ok action

Alert.shared.show(title: "No Internet Connection", message: "The internet connection appers to be offline.", viewController: self, okAction: {
                            //ok action 
}, cancelAction: {
 //cancel action
}) //with cancel and ok action

Alert.shared.showWithTimer(message : "This is an alert with timer", viewController : self) //with timer

1
  // UIAlertView is deprecated. Use UIAlertController 
  // title = title of the alert view.
  // message = Alert message you want to show.
  // By tap on "OK" , Alert view will dismiss.

 UIAlertView(title: "Alert", message: "Enter Message here.", delegate: nil, cancelButtonTitle: "OK").show()

您可以在发布的代码中添加解释吗?到目前为止,按照SO规则,您的答案实际上并不能算是一个好的答案。
尼克·贝尔

警报视图现在已迅速更改为4。使用警报控制器
Sandeep Singh,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.