我如何在Swift中创建一个UIAlertView ?

我一直在努力创建一个UIAlertView在Swift,但由于某种原因,我不能得到正确的声明,因为我得到这个错误:

无法找到接受提供的'init'的重载 参数< / p >

我是这样写的:

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

然后我使用:

button2Alert.show()

到目前为止,它正在崩溃,我只是不能得到正确的语法。

701305 次浏览

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)

你可以使用标准的构造函数创建一个UIAlert,但是“遗留的”构造函数似乎不起作用:

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

我找到了这个,

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

也许有人能解释一下。

它不工作的原因是因为你传递给函数的某个值不正确。swift不像Objective-C,你可以把nil放在类类型的参数中,没有任何限制(可能是)。参数otherButtonTitles被定义为非可选的,其类型的末尾没有(?)。所以你必须传递一个具体的值给它。

显示UIAlertView在swift语言:-

协议UIAlertViewDelegate

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

显示UIAlertViewController在swift语言:-

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)
@IBAction func Alert(sender: UIButton) {


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


alertView.show()


}

试试这个

不要在构造函数中提供otherbuttontitle。

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


alertView.show()

但我同意Oscar的观点,这个类在iOS 8中被弃用了,所以如果你只做iOS 8的应用程序,UIAlertView不会没有任何用途。否则上面的代码将工作。

如果你的目标是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()
}
}

斯威夫特有一个有趣的例子:

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

# EYZ0

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


}

完成两个按钮OK &取消

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

我得到了下面的UIAlertView初始化代码编译没有错误(我认为最后,变量部分可能是棘手的)。但是我必须确保self的类(我作为委托传递)采用了UIAlertViewDelegate协议来消除编译错误:

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

顺便说一下,这是我得到的错误(作为Xcode 6.4):

无法为类型'UIAlertView'找到接受参数的初始化式 类型为'的参数列表(标题:字符串,消息:字符串,委托: MyViewController, cancelButtonTitle: String, otherbuttontitle: 字符串)的< / p >

正如其他人提到的,如果你的目标是iOS 8.x+,你应该迁移到UIAlertController。要支持iOS 7,请使用上面的代码(Swift不支持iOS 6)。

我还有一招。假设您有5个类,其中要应用注销警报。尝试使用swift类扩展。

文件-新建- 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 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!")
}
}

一个按钮

一键截图

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

两个按钮

Two Button Alert截图

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

三个按钮

enter image description here

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
  • 对于超过三个按钮,可以考虑使用动作表。设置非常相似。# EYZ0

我已经做了一个单例类,以便从应用程序的任何地方使用: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.")

下面是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()


}

在使用此函数时,必须将message作为字符串传递。

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

斯威夫特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
}

使用此代码显示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)

参考:# EYZ0

在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)
< p >试试这个。

.

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

# EYZ0

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)

对于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


}
}

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


}
  // 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()

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

下面是警报视图和动作表的可重用代码,只需写一行在应用程序的任何地方显示警报

class AlertView{


static func show(title:String? = nil,message:String?,preferredStyle: UIAlertControllerStyle = .alert,buttons:[String] = ["Ok"],completionHandler:@escaping (String)->Void){
let alert = UIAlertController(title: title, message: message, preferredStyle: preferredStyle)


for button in buttons{


var style = UIAlertActionStyle.default
let buttonText = button.lowercased().replacingOccurrences(of: " ", with: "")
if buttonText == "cancel"{
style = .cancel
}
let action = UIAlertAction(title: button, style: style) { (_) in
completionHandler(button)
}
alert.addAction(action)
}


DispatchQueue.main.async {
if let app = UIApplication.shared.delegate as? AppDelegate, let rootViewController = app.window?.rootViewController {
rootViewController.present(alert, animated: true, completion: nil)
}


}
}
}

# EYZ0

class ViewController: UIViewController {


override func viewWillAppear(_ animated: Bool) {
AlertView.show(title: "Alert", message: "Are you sure ?", preferredStyle: .alert, buttons: ["Yes","No"]) { (button) in
print(button)
}
}


}

在Swift 4.2和Xcode 10中

方法一:

简单的提醒

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

方法二:

使用共享类的警报

如果你想要共享类风格(写一次,随处使用)

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

方法三:

显示所有窗口的警告顶部

如果您想在所有视图的顶部显示警报,请使用以下代码

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

方法四:

带扩展的警报

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

方法五:

带有文本字段的警报

如果你想添加文本框提醒。

//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:

带扩展的共享类中的警报

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

现在在你所有的类中调用alert函数(单行)。

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

怎么样....

你可以使用这个简单的扩展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])

Swift 5上的SwiftUI。x和Xcode 11.x

import SwiftUI


struct ContentView: View {


@State private var isShowingAlert = false


var body: some View {
VStack {
Button("A Button") {


self.isShowingAlert.toggle()
}
.alert(isPresented: $isShowingAlert) { () -> Alert in
Alert(
title: Text("Alert"),
message: Text("This is an alert"),
dismissButton:
.default(
Text("OK"),
action: {
print("Dismissing alert")
}
)
)
}


}
.padding()
}
}


struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

iOS 13 Xcode 11+ Swift 5。X

UIAlertController现在可以提供警报以及动作表

警报

// First instantiate the UIAlertController


let alert = UIAlertController(title: "Title",
message: "Message ?",
preferredStyle: .alert)




// Add action buttons to it and attach handler functions if you want to


alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
alert.addAction(UIAlertAction(title: "Just Do It!", style: .destructive, handler: nil))
alert.addAction(UIAlertAction(title: "Maybe", style: .default, handler: nil))


// Show the alert by presenting it


self.present(alert, animated: true)

请注意,当点击警报视图时,所有操作按钮的基本属性都是关闭警报视图。文本的style参数只是用来决定颜色(以及按钮应该出现的一些默认顺序,ofc可以更改)

示例处理程序函数可以是

func handler(_ action: UIAlertAction) {


if action.title == 'Title' {
// do stuff
}


}
作为旁注,我想说的是,与其创建3个不同的处理程序,你可以只创建1个处理程序,并以如上所示的方式跟踪到引发它的元素 我们也可以检查alert.style,但我们可以有多个.default风格的动作,我不建议

动作表

解释是类似的,因为这里的主要区别是警报打断用户,而操作表从iPhone底部滑出和在iPad中以弹出窗口的形式出现

操作表的目的是指导用户根据当前状态决定操作。所以你必须像对待十字路口一样对待动作表单!通常没有消息,标题呈现为标题大小的文本

let action = UIAlertController(title: "What do you want to do with the message",
message: nil,
preferredStyle: .actionSheet)


action.addAction(UIAlertAction(title: "Cancel", style: .cancel))


for act in ["Save", "Post", "Discard"] {
action.addAction(UIAlertAction(title: act, style: .default, handler: nil))
}


self.present(action, animated: true)

上面的代码将适用于iPhone,但将在iPad运行时崩溃,因为UIPopoverPresentationController将负责警报,它不会在那个时候引用任何东西。因此,为了避免这种情况,您必须提供以下代码块,这是强制性的

if let pop = action.popoverPresentationController {


let v = sender as! UIView
pop.sourceView = v
pop.sourceRect = v.bounds
}

此外,如果iPad点击弹窗之外的任何地方,将会解散它,.cancel操作按钮的完成处理程序将被调用。

也就是说,如果你有任何疑问,请在下方评论

AlertView Swift 5及以上:-

let alert = UIAlertController(title: LocalizedStringConstant.alert, message: message, preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "Retry", style: .cancel, handler: { (_) in
}))
self.present(alert, animated: true, completion: nil)

或者这样做

        let alert = UIAlertController(title: "Alert", message: "Saved Successfully", preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "Ok", style: UIAlertAction.Style.default, handler: nil))
self.present(alert, animated: true, completion: nil)

以上13.0版本 使用SceneDelegate < / p >

适用于所有类型的课程

static func showWindowAlert(alertMessage: String, inVC:UIViewController) {
DispatchQueue.main.async(execute: {
guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let sceneDelegate = windowScene.delegate as? SceneDelegate
else {
return
}
sceneDelegate.window?.rootViewController = inVC
sceneDelegate.window?.windowLevel = UIWindow.Level.alert + 1
        

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

sceneDelegate.window?.makeKeyAndVisible()
        

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