ฉันจะสร้าง UIAlertView ใน Swift ได้อย่างไร


481

ฉันทำงานเพื่อสร้าง UIAlertView ใน Swift แต่ด้วยเหตุผลบางอย่างที่ฉันไม่สามารถรับข้อความได้เนื่องจากฉันได้รับข้อผิดพลาดนี้:

ไม่พบโอเวอร์โหลดสำหรับ 'init' ที่ยอมรับอาร์กิวเมนต์ที่ให้มา

นี่คือวิธีที่ฉันเขียนมัน:

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

จากนั้นเรียกมันว่าฉันกำลังใช้:

button2Alert.show()

ณ ตอนนี้มันพังและฉันก็ดูเหมือนจะไม่ได้รับไวยากรณ์ที่ถูกต้อง


5
UIAlertViewและUIActionSheetถูกแทนที่ด้วยUIAlertControllerใน iOS 8 คุณเคยดูสิ่งนี้หรือไม่?
Popeye

ตรวจสอบให้แน่ใจว่าคลาสที่selfเป็นของ adopts โปรโตคอลUIAlertViewDelegate(วิธีที่แนะนำในการทำสิ่งนี้ใน Swift คือด้วยส่วนขยาย)
Nicolas Miari

@ อดัม: ฉันหวนกลับของคุณ retagging swift3แท็กสำหรับ"คำถามที่เกี่ยวข้องโดยตรงกับการเปลี่ยนแปลงในรุ่นที่ 3 ของแอปเปิ้ลสวิฟท์ในการเขียนโปรแกรมภาษา." และฉันไม่คิดว่า"ถ้าคำตอบทำให้ชัดเจนว่าปัญหาในคำถามนั้นเกิดจากสิ่งอื่นที่ไม่ใช่ความคิดของผู้ถามการติดแท็กซ้ำนั้นมีประโยชน์มาก" จากmeta.stackoverflow.com/questions/252079/ใช้กับที่นี่
Martin R

1
@MartinR ฉันไม่รู้ว่าจะสามารถอัปเดตคำถามได้อย่างไรเพื่อแสดงว่ามีคำตอบที่ใช้กับ Swift เวอร์ชันปัจจุบัน มีของเก่าและไร้ประโยชน์มากมายที่นี่และ [รวดเร็ว] พบว่ามันมีประโยชน์ ฉันไม่รู้สึกอย่างแรงกล้าเกี่ยวกับ retag นี้ แต่ฉันหวังว่าจะมีวิธีที่ชัดเจนในการแก้ปัญหานี้ (ฉันหวังว่าคำตอบจะมีแท็ก)
Adam Eberbach

คำตอบ:


897

จากUIAlertViewชั้นเรียน:

// UIAlertView เลิกใช้แล้ว ใช้UIAlertControllerกับสไตล์ที่ต้องการของ UIAlertControllerStyleAlert แทน

บน 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เป็นชั้นเดียวสำหรับการสร้างและการมีปฏิสัมพันธ์กับสิ่งที่เรารู้ดีว่าUIAlertViewและUIActionSheets บน iOS 8

แก้ไข:เพื่อจัดการกับการกระทำ:

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

9
Cmd + คลิกที่UIAlertViewคลาสและความคิดเห็นนั้นอยู่ด้านบนของการประกาศคลาส
Oscar Swanros

2
ฉันจะตอบคำถามของฉันเองสำหรับคนอื่นที่อยากรู้อยากเห็น addAction (UIAlertAction (ชื่อเรื่อง: "ยกเลิก", ​​สไตล์: UIAlertActionStyle.Cancel, handler: {(ACTION: UIAlertAction!) ใน))
altyus

5
ประเด็นของการยกเลิกและการทำลายล้างเนื่องจากมันจะเป็นสิ่งที่คุณระบุไว้เสมอ.Default?
ผู้ใช้

4
อ่านหนังสือนี้คำตอบกรณีที่สวิทช์ที่คุณคิดว่าเป็นที่ไม่จำเป็น สวิตช์มีประโยชน์เฉพาะในกรณีที่ประเภทหรือชื่อไม่ได้ฮาร์ดโค้ดนั่นคือแบบไดนามิก: คุณอาจมีชุดของปุ่มแบบไดนามิกเพื่อให้ชื่อไม่ได้ฮาร์ดโค้ด และจากนั้นผู้ดำเนินการอาจต้องส่งชื่อที่เลือกไปยังการเรียกใช้วิธีอื่น
ฮันนี่

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

การจัดการ Taps ปุ่ม

handlerเป็นnilตัวอย่างข้างต้น คุณสามารถแทนที่nilด้วยการปิดเพื่อทำบางสิ่งเมื่อผู้ใช้แตะปุ่ม ตัวอย่างเช่น:

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

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

}))

หมายเหตุ

  • ปุ่มหลายปุ่มไม่จำเป็นต้องใช้UIAlertAction.Styleชนิดที่แตกต่างกัน .defaultพวกเขาทุกคนจะ
  • สำหรับปุ่มมากกว่าสามปุ่มให้พิจารณาใช้ Action Sheet การตั้งค่าคล้ายกันมาก นี่คือตัวอย่าง

2
มีคุณสมบัติของผู้แทนใน UIAlertController? ใน UIAlertView มีคุณสมบัติตัวแทนซึ่งบางครั้งเราตั้งค่าให้ตัวเองมีอะไรเช่นนี้ใน UIAlertController หรือไม่? ฉันใหม่โปรดช่วยฉันด้วย
ArgaPK

คำตอบที่สวยงาม - ตอนนี้เราจะเปลี่ยนมุมมองใหม่ภายในตัวจัดการได้อย่างไร
That1Guy

114

คุณสามารถสร้าง UIAlert ได้โดยใช้ตัวสร้างมาตรฐาน แต่หนึ่งใน 'มรดก' ดูเหมือนจะไม่ทำงาน:

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

8
UIAlertView เลิกใช้แล้ว ใช้ UIAlertController กับสไตล์ที่ต้องการของ UIAlertControllerStyleAlert แทน
Zorayr

16
@ Zorayr UIAlertController มีให้ตั้งแต่ iOS 8 เป็นต้นไปเท่านั้นโปรดระบุด้วยว่าเมื่อแนะนำการใช้งาน มีบางสถานการณ์ที่ต้องการการสนับสนุน iOS7 และผู้คนอาจพลาดปัญหา การเลิกใช้ไม่ได้หมายความว่า "ไม่เคยใช้สิ่งนี้อีกต่อไป"
Sami Kuhmonen

2
สิ่งนี้จะทำงานได้หากแอปของคุณยังคงกำหนดเป้าหมายเป็น iOS 7 อย่างไรก็ตามควรใช้ UIAlertView ในกรณีที่ UIAlertController ไม่สามารถใช้ได้ if 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:

การแจ้งเตือนที่มีอยู่ด้านบนของหน้าต่างทั้งหมด

หากคุณต้องการแสดงการแจ้งเตือนที่ด้านบนของทุกมุมมองให้ใช้รหัสนี้

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:

แจ้งเตือนด้วย TEXTFIELDS

หากคุณต้องการเพิ่มฟิลด์ข้อความเพื่อแจ้งเตือน

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

การแจ้งเตือนโดยไม่ต้องแชร์คลาสพร้อมส่วนขยายในระดับแยกต่างหากสำหรับการแจ้งเตือน

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)

เป็นอย่างไรบ้าง ....


Perfekt! +1 คุณสามารถเพิ่มวิธีด้วยการหมดเวลารวมได้หรือไม่? ขอบคุณ!
PascalS

@ Passe ขอโทษด้วยฉันไม่เข้าใจโปรดอธิบายสั้น ๆ ได้
iOS

ฉันต้องการ alertController ซึ่งจะแสดงจนกระทั่งคลิกปุ่ม 'ตกลง' หรือหมดเวลา บางอย่างเช่นวิธีที่ 6 หรือ 7 แต่มีตัวแปรอินพุตเพิ่มเติม 'หมดเวลา'
PascalS

ส่วนขยาย UIViewController {func alertWithTime (ชื่อ: String, msg: String, timeInterval: TimeInterval) {DispatchQueue.main.async {แจ้งเตือน = UIAlertController (ชื่อเรื่อง: ข้อความ, msg, PreferredStyle: .Alert (UIAlertAction) : "OK", style: .default, handler: nil)) self.present (แจ้งเตือน, ภาพเคลื่อนไหว: true, complete: nil) ถ้า #available (iOS 10.0, *) {Timer.scheduledTimer (withTimeInterval: timeInterval: timeInterval, ซ้ำ: false , บล็อก: {_ ใน alert.dismiss (เคลื่อนไหว: จริง, เสร็จสิ้น: ไม่มี)})} else {// สำรองในเวอร์ชันก่อนหน้านี้}}}}
iOS

1
หากคุณพูดถึง timeInterval 0 ในกรณีนั้นหากคุณไม่ต้องการปิดการแจ้งเตือนให้ใช้เงื่อนไข 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 คุณต้องมีสิ่งนี้เพื่อให้แน่ใจว่าคุณใช้วิธีที่ถูกต้องสำหรับแต่ละรุ่นเพราะ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()
    }
}

หรือคุณสามารถประหยัดเวลาและใช้เพียงUIAlertViewจนกว่าคุณจะหยุดการสนับสนุน iOS 7 Apple จะไม่ปฏิเสธแอปของคุณ
cprcrack

2
การเลิกใช้งานไม่ได้หมายความว่า "ไม่ใช้สิ่งนี้" หรือว่าเป็น "วิธีการที่ไม่ถูกต้อง" แต่ก็หมายความว่ามันจะไม่ทำงานในภายหลัง ไม่จำเป็นต้องใช้ UIAlertController บน iOS8 โดยเฉพาะหากต้องการเพียงการแจ้งเตือนพื้นฐาน พวกเขาจะทำงานเหมือนก่อน มี API จำนวนมากที่เลิกใช้แล้วใน iOS4 หรือ 5 และยังคงใช้งานได้ใน iOS8 แต่แน่นอนว่าแอปที่กำหนดเป้าหมายระดับ iOS ที่สูงกว่าไม่ควรใช้และนั่นคือสาเหตุที่มีคำเตือนการเลิกใช้งาน
Sami Kuhmonen

1
@SamiKuhmonen ไม่ แต่มันชัดเจนว่าทำไมคุณถึงทำในสิ่งที่คุณทำและทำให้ง่ายต่อการลบการสนับสนุนสำหรับวิธีการที่เลิกใช้เมื่อรุ่นต่ำสุดของคุณสูงพอที่จะทำเช่นนั้นได้
AstroCB

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' เป็น 'ปัจจุบัน'
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

เพียง แต่ไม่ได้ให้ปุ่มอื่น ๆ ในตัวสร้าง

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

alertView.show()

แต่ฉันเห็นด้วยกับ Oscar คลาสนี้เลิกใช้แล้วใน iOS 8 ดังนั้นจะไม่ใช้ UIAlertView หากคุณใช้แอพ iOS 8 เท่านั้น มิฉะนั้นโค้ดด้านบนจะใช้งานได้


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

6
หากคุณเรียกใช้แอพที่ต้องใช้งานร่วมกับ iOS7.1 ได้และคุณเขียนไว้ใน Swift UIAlertController จะทำให้อุปกรณ์เป้าหมายเสียหาย คุณต้องสนับสนุน UIAlertViews ดั้งเดิมสำหรับ iOS7
Joe

ฉันคิดว่ามันไม่ใช่สวิฟต์ที่จะทำให้เกิดความผิดพลาด แต่ความจริงที่ว่า UIAlertController ไม่พร้อมใช้งานก่อน iOS 8
Frédéric Adda

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

5

ฉันมีเคล็ดลับอื่น สมมติว่าคุณมี 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 () หวังว่ามันจะช่วย


5

ฉันได้จัดคลาสเดี่ยวเพื่อให้สะดวกในการใช้จากทุกที่ในแอปของคุณ: 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

1
เฮ้ @ Swinny89 ขอบคุณมากสำหรับการแบ่งปันโซลูชันนี้กับเรา! ฉันติดอยู่กับสิ่งปิดและคุณก็ช่วยฉัน!
Bruno Campos

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 (การกระทำ)" สไตล์ที่แตกต่างคือ. default, .devructive และ. 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):

ไม่พบ initializer สำหรับประเภท 'UIAlertView' ที่ยอมรับรายการอาร์กิวเมนต์ประเภท '(ชื่อเรื่อง: สตริง, ข้อความ: สตริง, ผู้รับมอบสิทธิ์: MyViewController, cancelButtonTitle: สตริง, otherButtonTitles: String)'

ตามที่คนอื่นพูดถึงคุณควรย้ายไปที่ UIAlertController หากคุณสามารถกำหนดเป้าหมาย iOS 8.x + เพื่อรองรับ 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

คุณสามารถใช้ส่วนขยายอย่างง่ายนี้ด้วยจำนวนปุ่มและการดำเนินการที่เกี่ยวข้อง 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

คำตอบที่ยอดเยี่ยม นี่คือสิ่งที่ฉันต้องการ ขอบคุณ!
Gregory Wilson Pullyattu

3

เหตุผลที่มันไม่ทำงานเพราะค่าบางอย่างที่คุณส่งผ่านไปยังฟังก์ชั่นไม่ถูกต้อง swift ไม่ชอบ Objective-C คุณสามารถใส่ nil ให้กับอาร์กิวเมนต์ซึ่งเป็นประเภทคลาสโดยไม่มีข้อ จำกัด ใด ๆ (อาจเป็น) อาร์กิวเมนต์ otherButtonTitles ถูกกำหนดเป็น non-optional ซึ่งชนิดของมันไม่มี (?) ในตอนท้าย ดังนั้นคุณจะต้องส่งผ่านค่าที่เป็นรูปธรรมไป


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)

การอ้างอิง: Swift Show Alert โดยใช้ UIAlertController


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

โดยทั่วไปแล้วคำตอบจะมีประโยชน์มากขึ้นหากพวกเขามีคำอธิบายว่าควรใช้รหัสใดและเหตุใดจึงแก้ปัญหาได้โดยไม่ต้องแนะนำผู้อื่น ขอบคุณสำหรับการปรับปรุงค่าอ้างอิงของคำตอบและทำให้เข้าใจได้ง่ายขึ้น!
ทิม Diekmann

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

นี่คือฟังก์ชั่นง่ายๆของ AlertView ใน Swift:

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

    }

คุณต้องส่งข้อความเป็น String ซึ่งคุณใช้ฟังก์ชั่นนี้


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
Nico Van Belle

มุมมองการแจ้งเตือนมีการเปลี่ยนแปลงในขณะนี้อย่างรวดเร็ว 4. ใช้ตัวควบคุมการแจ้งเตือน
Sandeep Singh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.