Bagaimana saya membuat UIAlertView di Swift?

481

Saya telah bekerja untuk membuat UIAlertView di Swift, tetapi untuk beberapa alasan saya tidak bisa mendapatkan pernyataan dengan benar karena saya mendapatkan kesalahan ini:

Tidak dapat menemukan kelebihan untuk 'init' yang menerima argumen yang disediakan

Begini cara saya menulisnya:

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

Lalu untuk menyebutnya saya menggunakan:

button2Alert.show()

Sampai sekarang ini sedang crash dan sepertinya saya tidak bisa mendapatkan sintaks yang benar.

BlueBear
sumber
5
UIAlertViewdan UIActionSheettelah diganti oleh UIAlertControllerdi iOS 8, sudahkah Anda melihat ini?
Popeye
Pastikan kelas yang selftermasuk dalam mengadopsi protokol UIAlertViewDelegate(cara yang disarankan untuk melakukan ini, di Swift, adalah dengan ekstensi).
Nicolas Miari
@ Adam: Saya telah mengembalikan retagging Anda. The swift3 tag untuk "pertanyaan yang berhubungan langsung dengan perubahan dalam versi 3 bahasa pemrograman Apple Swift." Dan saya tidak berpikir bahwa "Jika jawaban memperjelas bahwa masalah dalam pertanyaan itu disebabkan oleh sesuatu selain dari apa yang dipikirkan penanya, retagging sangat membantu." dari meta.stackoverflow.com/questions/252079/… berlaku di sini.
Martin R
1
@ MartinR Saya tidak tahu bagaimana pertanyaan dapat diperbarui untuk menunjukkan bahwa ada jawaban yang berlaku untuk versi Swift saat ini; ada banyak hal-hal lama yang tidak berguna di sini dan [swift] menemukan semuanya beserta manfaatnya. Saya tidak merasa kuat tentang retag ini dikembalikan tetapi saya berharap ada cara pasti untuk menyelesaikan masalah ini. (Saya berharap jawaban memiliki tag.)
Adam Eberbach

Jawaban:

897

Dari UIAlertViewkelas:

// UIAlertView sudah usang. Gunakan UIAlertController denganStyleStyle yang dipilih dari UIAlertControllerStyleAlert sebagai gantinya

Di iOS 8, Anda dapat melakukan ini:

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)

Sekarang UIAlertControlleradalah satu kelas untuk membuat dan berinteraksi dengan apa yang kita ketahui sebagai UIAlertViewdan UIActionSheetdi iOS 8.

Sunting: Untuk menangani tindakan:

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

Edit untuk 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)

Edit untuk 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)
Oscar Swanros
sumber
3
Di mana Anda melihat bahwa UIAlertView sudah usang? Saya tidak melihatnya di dokumentasi?
BlueBear
9
Cmd + Klik UIAlertViewkelas, dan komentar tepat di atas deklarasi kelas.
Oscar Swanros
2
Saya akan menjawab pertanyaan saya sendiri untuk siapa pun yang ingin tahu alert.addAction (UIAlertAction (judul: "Batal", gaya: UIAlertActionStyle.Cancel, penangan: {(AKSI: UIAlertAction!) Di}))
altyus
5
Apa gunanya Batal dan Merusak kasus karena akan selalu menjadi apa yang Anda tentukan .Default?
Pengguna
4
Membaca jawaban ini , sakelar yang Anda lakukan tidak perlu . Switch hanya berguna jika jenis, atau judul tidak di-hardcode, yaitu judulnya dinamis: Anda mungkin memiliki serangkaian tombol dinamis sehingga judul-judul tersebut tidak di-hardcode. Dan kemudian pawang mungkin perlu memberikan gelar yang dipilih ke panggilan metode lain
Honey
465

Satu tombol

Tangkapan Layar Satu Tombol

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

Dua tombol

Screenshot Peringatan Dua Tombol

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

Tiga tombol

masukkan deskripsi gambar di sini

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

Menangani Tombol Tekan

The handleradalah nilpada contoh di atas. Anda dapat mengganti nildengan penutup untuk melakukan sesuatu ketika pengguna mengetuk tombol. Sebagai contoh:

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

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

}))

Catatan

  • Beberapa tombol tidak harus menggunakan UIAlertAction.Stylejenis yang berbeda . Mereka semua bisa .default.
  • Untuk lebih dari tiga tombol, pertimbangkan untuk menggunakan Lembar Tindakan. Pengaturannya sangat mirip. Berikut ini sebuah contoh.
Suragch
sumber
2
apakah ada properti delegasi di UIAlertController? di UIAlertView ada properti delegasi yang kadang kita atur sendiri, apakah tidak ada yang seperti ini di UIAlertController ?? Saya Baru, tolong bantu saya
ArgaPK
Jawaban indah - Sekarang bagaimana kita bisa beralih ke tampilan baru di dalam handler?
That1Guy
114

Anda dapat membuat UIAlert menggunakan konstruktor standar, tetapi 'legacy' tampaknya tidak berfungsi:

let alert = UIAlertView()
alert.title = "Alert"
alert.message = "Here's a message"
alert.addButtonWithTitle("Understood")
alert.show()
Ben Gottlieb
sumber
8
UIAlertView sudah usang. Gunakan UIAlertController denganStyleStyle yang dipilih dari UIAlertControllerStyleAlert sebagai gantinya.
Zorayr
16
@Zorayr UIAlertController hanya tersedia dari iOS 8 dan seterusnya, harap sebutkan juga saat menyarankan penggunaannya. Ada situasi di mana dukungan iOS7 masih diinginkan dan orang-orang mungkin kehilangan masalahnya. Penghentian tidak berarti "jangan pernah menggunakan ini lagi."
Sami Kuhmonen
2
Ini berfungsi jika aplikasi Anda masih menargetkan iOS 7. Namun, idealnya UIAlertView hanya boleh digunakan ketika UIAlertController tidak tersedia. jika NSClassFromString ("UIAlertController")! = nil {/ * gunakan UIAlertController * /} else {/ * gunakan UIAlertView * /}
phatblat
UIAlertview () sekarang tidak digunakan lagi di iOS 9
Rizwan Ahmed
31

Di Swift 4.2 dan Xcode 10

Metode 1:

ALERT SEDERHANA

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

Metode 2:

PERINGATAN DENGAN KELAS BERBAGI

Jika Anda ingin gaya kelas bersama (Tulis sekali pakai di mana saja)

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

Sekarang panggil lansiran seperti ini di setiap perangkat

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

Metode 3:

PERINGATKAN ALERT TOP OF SEMUA WINDOWS

Jika Anda ingin menyampaikan peringatan di atas semua tampilan, gunakan kode ini

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

Panggilan fungsi

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

Metode 4:

Peringatan dengan Ekstensi

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

Sekarang panggil seperti ini

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

Metode 5:

PERINGATAN DENGAN TEKS

Jika Anda ingin menambahkan bidang teks untuk mengingatkan.

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

}

Metode 6:

Lansiran di SharedClass dengan Ekstensi

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

Sekarang panggil langsung seperti ini

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

Metode 7:

Peringatan tanpa kelas bersama dengan Ekstensi di kelas terpisah untuk peringatan.

Buat satu kelas Swift baru, dan import UIKit. Salin dan tempel kode di bawah ini.

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

Sekarang panggil fungsi peringatan seperti ini di semua kelas Anda (saluran tunggal).

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

Bagaimana itu....

iOS
sumber
Perfekt! +1 Bisakah Anda menambahkan metode dengan batas waktu terintegrasi? Terima kasih!
PascalS
@ Passe, maaf saya tidak mengerti, bisa tolong jelaskan secara singkat.
iOS
Saya memerlukan alertController yang disajikan hingga tombol 'OK' diklik atau terjadi timeout. Sesuatu seperti metode 6 atau 7 tetapi dengan variabel input tambahan 'batas waktu'.
PascalS
extension UIViewController {func alertWithTime (judul: String, msg: String, timeInterval: TimeInterval) {DispatchQueue.main.async {let alert = UIAlertController (judul: judul, pesan: pesan, preferStyle: .alert) alert.addAction (UIAlertAction (title) : "OK", style: .default, handler: nil)) self.present (waspada, animasi: true, selesai: nil) jika #available (iOS 10.0, *) {Timer.scheduledTimer (withTimeInterval: timeInterval, repeats: false , blokir: {_ in alert.dismiss (dianimasikan: true, selesai: nil)})} else {// Fallback pada versi sebelumnya}}}}
iOS
1
Jika Anda menyebutkan timeInterval 0 dalam hal itu jika Anda tidak ingin menutup lansiran, gunakan kondisi jika. 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

Klik Tampilan

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

}

Dilakukan dengan dua tombol, OK & Batal

Hiren Patel
sumber
12

Jika Anda menargetkan iOS 7 dan 8, Anda perlu sesuatu seperti ini untuk memastikan Anda menggunakan metode yang tepat untuk setiap versi, karena UIAlertViewsudah usang di iOS 8, tetapi UIAlertControllertidak tersedia di 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()
    }
}
AstroCB
sumber
Atau Anda dapat menghemat waktu dan hanya menggunakan UIAlertViewsampai Anda menjatuhkan dukungan untuk iOS 7. Apple tidak akan menolak aplikasi Anda untuk itu.
cprcrack
2
Penghentian tidak berarti "jangan gunakan ini" atau itu akan menjadi "metode yang salah", itu hanya berarti itu tidak akan berfungsi nanti. Tidak perlu secara khusus menggunakan UIAlertController di iOS8 jika seseorang hanya membutuhkan peringatan dasar. Mereka akan bekerja seperti sebelumnya. Ada banyak API yang sudah usang di iOS4 atau 5 dan masih berfungsi di iOS8. Tapi tentu saja aplikasi yang menargetkan level iOS yang lebih tinggi tidak boleh menggunakannya dan itu sebabnya ada peringatan penghentian.
Sami Kuhmonen
1
@SamiKuhmonen Tidak, tetapi membuatnya lebih jelas mengapa Anda melakukan apa yang Anda lakukan dan membuatnya lebih mudah untuk menghapus dukungan untuk metode yang sudah usang ketika versi minimum Anda cukup tinggi untuk melakukannya.
AstroCB
12

Dengan ekstensi protokol Swift 2, Anda dapat membuat protokol yang menyediakan implementasi default untuk pengontrol tampilan Anda:

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

LihatController.swift

class ViewController: UIViewController, ShowsAlert {
    override func viewDidLoad() {
        super.viewDidLoad()
        showAlert(message: "Hey there, I am an error message!")
    }
}
knshn
sumber
1
Bekerja dengan sempurna. Untuk Swift3, ubah 'presentViewController' menjadi 'present'.
Vincent
11

Tampilkan UIAlertView dalam bahasa cepat: -

Protokol UIAlertViewDelegate

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

Tampilkan UIAlertViewController dalam bahasa cepat: -

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)
Anit Kumar
sumber
11

Sederhananya, jangan berikan Tombol lain di konstruktor.

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

alertView.show()

Tapi saya setuju dengan Oscar, kelas ini sudah usang di iOS 8, jadi tidak akan ada penggunaan UIAlertView jika Anda melakukan aplikasi iOS 8 saja. Kalau tidak, kode di atas akan berfungsi.

Peymankh
sumber
9

Saya menemukan ini,

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

tidak bagus, tapi berhasil :)

Memperbarui:

tapi saya temukan di file header sebagai:

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

seseorang dapat menjelaskan hal ini.

Mujah Maskey
sumber
Rupanya UIAlertView telah usang di iOS 8 dan kami sekarang menggunakan UIAlertController dengan gaya pilihan UIAlertControllerStyleAlert.
BlueBear
6
Jika Anda menjalankan aplikasi yang harus kompatibel dengan iOS7.1 dan Anda menulisnya di Swift, UIAlertController akan menabrak perangkat target. Anda perlu mendukung UIAlertViews lawas untuk iOS7.
Joe
Saya pikir itu bukan Swift yang akan menyebabkan crash, melainkan fakta bahwa UIAlertController tidak tersedia sebelum iOS 8
Frédéric Adda
7

Untuk SWIFT4 , saya pikir, memperluas UIViewControllerdan membuat kontrol konfirmasi yang dapat digunakan kembali adalah cara yang paling elegan.

Anda dapat memperpanjang UIViewControllerseperti di bawah ini:

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

Maka Anda dapat menggunakannya kapan saja:

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

        } else { //User has clicked on Cancel

        }
    }
emreoktem
sumber
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")
                }
            }
        }
    }
Jayesh Miruliya
sumber
Hanya menulis segumpal kode tidak terlalu berguna. Saat menjawab pertanyaan apa pun (khususnya pertanyaan lama dengan beberapa jawaban termasuk jawaban yang diterima) silakan tulis lebih dari sepotong kode. Silakan tambahkan penjelasan tentang apa yang kode Anda lakukan, bagaimana ia menjawab pertanyaan dan bagaimana itu berbeda (atau lebih baik) dari jawaban yang lain.
AdrianHHH
5

Saya punya trik lain. Misalkan Anda memiliki 5 kelas tempat peringatan logout diterapkan. Coba dengan ekstensi kelas cepat.

File- Baru- Swift class- Beri nama.

Tambahkan yang berikut ini:

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

Terapkan dengan menggunakan: self.makeLogOutAlert (). Semoga ini bisa membantu.

AG
sumber
5

Saya telah membuat kelas tunggal untuk membuat ini nyaman digunakan dari mana saja di aplikasi Anda: https://github.com/Swinny1989/Swift-Popups

Anda kemudian dapat membuat sembulan dengan beberapa tombol seperti ini:

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

atau sembulan dengan satu tombol seperti ini:

Popups.SharedInstance.ShowPopup("Title goes here", message: "Message goes here.")
Swinny89
sumber
Terima kasih. Saya kirimkan beberapa masalah di sana
djdance
1
Hey @ Swinny89 Terima kasih banyak untuk berbagi solusi ini dengan kami! Saya terjebak dengan hal penutupan dan Anda baru saja menyelamatkan saya!
Bruno Campos
5

Cepat 3

Berikut ini adalah contoh sederhana tentang cara membuat peringatan sederhana dengan satu tombol dengan Swift 3.

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

Dalam contoh di atas gagang panggilan balik tindakan telah dihilangkan karena perilaku default tampilan peringatan dengan satu tombol adalah menghilang ketika tombol diklik.

Berikut adalah cara membuat tindakan lain, yang dapat ditambahkan ke lansiran dengan "alert.addAction (action)". Gaya yang berbeda adalah .default, .destructive dan .cancel.

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

sumber
4

Saya mendapat yang berikut UIAlertView kode inisialisasi untuk dikompilasi tanpa kesalahan (saya pikir bagian terakhir, yang bervariasi mungkin rumit). Tetapi saya harus memastikan bahwa kelas self(yang saya sampaikan sebagai delegasi) mengadopsi UIAlertViewDelegateprotokol agar kesalahan kompilasi hilang:

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

Omong-omong, ini adalah kesalahan yang saya dapatkan (pada Xcode 6.4):

Tidak dapat menemukan inisialisasi untuk tipe 'UIAlertView' yang menerima daftar argumen tipe '(judul: String, pesan: String, delegasi: MyViewController, cancelButtonTitle: String, otherTombolTutles: String)'

Seperti yang disebutkan lainnya, Anda harus bermigrasi ke UIAlertController jika Anda dapat menargetkan iOS 8.x +. Untuk mendukung iOS 7, gunakan kode di atas (iOS 6 tidak didukung oleh Swift).

Nicolas Miari
sumber
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)

}
Mr.Javed Multani
sumber
4

Anda dapat menggunakan ekstensi sederhana ini dengan n jumlah tombol dan tindakan terkait swift4 dan di atasnya

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

Anda bisa menggunakannya seperti,

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]) 
midhun p
sumber
tolong jangan posting jawaban duplikat. Jika Anda ingin mengedit jawaban Anda.
iOS
Jawaban yang sangat bagus. Ini yang saya butuhkan. Terima kasih!
Gregory Wilson Pullyattu
3

Alasan itu tidak berfungsi karena beberapa nilai yang Anda berikan ke fungsi tidak benar. swift tidak suka Objective-C, Anda dapat menempatkan nol pada argumen yang merupakan tipe kelas tanpa batasan (mungkin). Argumen otherButtonTitles didefinisikan sebagai non-opsional yang jenisnya tidak memiliki (?) Pada akhirnya. jadi Anda harus memberikan nilai konkret untuk itu.

Oscar Wu
sumber
3
@IBAction func Alert(sender: UIButton) {

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

    alertView.show()

}

Coba ini

Gskril
sumber
3

Gunakan kode ini untuk menampilkan tampilan peringatan

  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)

Referensi: Swift Show Alert menggunakan UIAlertController

Shaba Aafreen
sumber
3

dalam 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)
luhuiya
sumber
3

SWIFT 4: Cukup buat ekstensi ke UIViewController sebagai berikut:

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

Sekarang di ViewController Anda, langsung panggil fungsi di atas seolah-olah disediakan oleh UIViewController.

    yourViewController.showSuccessAlert(withTitle: 
      "YourTitle", andMessage: "YourCustomTitle")
Shikha Budhiraja
sumber
Secara umum, jawaban akan jauh lebih membantu jika mereka menyertakan penjelasan tentang apa yang dimaksudkan untuk dilakukan oleh kode, dan mengapa hal itu menyelesaikan masalah tanpa memperkenalkan orang lain. Terima kasih telah meningkatkan nilai referensi jawaban dan membuatnya lebih mudah dimengerti!
Tim Diekmann
2

coba ini. Masukkan Kode Bellow Di Tombol.

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)
Sagar Sangani
sumber
1

Ini adalah contoh lucu di 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)
  }
}
Zorayr
sumber
1

Berikut adalah fungsi AlertView in Swift yang cukup sederhana:

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

    }

Anda harus meneruskan pesan sebagai String tempat Anda menggunakan fungsi ini.

iAnkit
sumber
1

The Old Way: 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 {

    // ...
   }
  }

Cara Baru: 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) {
 // ...
}
Shanmugasundharam
sumber
1

pada iOS 9, Anda dapat melakukan ini

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)
Keshav Gera
sumber
1

// Kelas Umum Untuk 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)
        }
    }
}
}

Menggunakan:-

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
Pratyush Pratik
sumber
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()
Hitesh Chauhan
sumber
Bisakah Anda menambahkan penjelasan pada kode yang Anda posting? Seperti sekarang, jawaban Anda tidak benar-benar memenuhi syarat sebagai jawaban yang baik oleh aturan SO.
Nico Van Belle
tampilan lansiran telah berubah sekarang di swift 4.use alert controller
Sandeep Singh