Swift'te nasıl UIAlertView oluşturabilirim?


481

Swift'te bir UIAlertView oluşturmak için çalışıyorum, ancak nedense bu hatayı alıyorum çünkü ifadeyi doğru alamıyorum:

Sağlanan bağımsız değişkenleri kabul eden 'init' için aşırı yük bulunamadı

İşte nasıl yazdı:

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

Sonra onu aramak için kullanıyorum:

button2Alert.show()

Şu an itibariyle çöküyor ve sözdizimini doğru anlayamıyorum.


5
UIAlertViewve UIActionSheetalmıştır UIAlertControllerbu baktım, iOS 8'de?
Temel Reis

selfAit olunan sınıfın protokolü benimsediğinden emin olun UIAlertViewDelegate(Swift için bunu yapmanın önerilen yolu bir uzantıya sahiptir).
Nicolas Miari

@Adam: Yeniden etiketlemeni geri aldım. Swift3 etiketi içindir "doğrudan Apple'ın Swift programlama dilinin sürüm 3 değişikliklere ilişkin sorular." Ve "Cevaplar sorudaki sorunun askerin düşündüğünden başka bir şeyden kaynaklandığını açıkça ortaya koyuyorsa, yeniden etiketlemenin çok yararlı olduğunu düşünmüyorum." buradan meta.stackoverflow.com/questions/252079/… geçerlidir.
Martin R

1
@MartinR Swift'in geçerli bir sürümü için geçerli cevaplar olduğunu göstermek için soruların nasıl güncellenebileceğini bilmiyorum; Burada bir sürü eski, işe yaramaz şey var ve [swift] hepsini faydalı ile birlikte bulur. Bu retag geri döndürülmüş hakkında güçlü hissetmiyorum ama keşke bu sorunu çözmek için kesin bir yol olsaydı. (Keşke cevapların etiketleri olsaydı.)
Adam Eberbach

Yanıtlar:


897

Sınıftan UIAlertView:

// UIAlertView kullanımdan kaldırıldı. Kullanım UIAlertController yerine UIAlertControllerStyleAlert bir preferredStyle ile

İOS 8'de şunları yapabilirsiniz:

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)

Şimdi iOS 8'de s ve s UIAlertControllerolarak bildiklerimizi oluşturmak ve etkileşimde bulunmak için tek bir sınıf .UIAlertViewUIActionSheet

Düzenleme: İşlemleri işlemek için:

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 için Düzenle:

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 için Düzenle:

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'in kullanımdan kaldırıldığını nereden gördünüz? Belgelerde görmüyorum?
BlueBear

9
Cmd + UIAlertViewSınıfı tıklatın; yorum, sınıf bildiriminin hemen üstündedir.
Oscar Swanros

2
Merak eden alert.addAction (UIAlertAction (başlık: "İptal", stil: UIAlertActionStyle.Cancel, işleyici: {(EYLEM: UIAlertAction!) İn}))
Altyus

5
Her zaman belirttiğiniz şey olacağından İptal ve Yıkıcı vakaların anlamı nedir .Default?
Kullanıcı

4
Bu yanıtı okuduğunuz anahtar durumunu okumak gereksizdir . Anahtar yalnızca tür veya başlık sabit kodlu değilse, yani dinamik olduklarında kullanışlıdır: Bir dizi
Honey

465

Bir Düğme

Bir Düğme Ekran Görüntüsü

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

İki Düğme

Önizleme Oyun İki Düğme Uyarısı

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

Üç Düğme

resim açıklamasını buraya girin

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

Düğme Musluklarını Kullanma

handlerOlduğu nil, yukarıdaki örneklerde. Kullanıcı bir düğmeye dokunduğunda bir şeyler yapmak için nilbir kapakla değiştirebilirsiniz . Örneğin:

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

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

}))

notlar

  • Birden fazla düğmenin farklı UIAlertAction.Styletürler kullanması gerekmez . Hepsi olabilirdi .default.
  • Üçten fazla düğme için bir İşlem Sayfası kullanmayı düşünün. Kurulum çok benzer. İşte bir örnek.

2
UIAlertController herhangi bir delege özelliği var mı? UIAlertView biz bazen kendine ayarlanmış bir delege özelliği var, UIAlertController böyle bir şey var mı ?? Ben
yeniyim

Güzel cevap - Şimdi, işleyicide yeni bir görünüme nasıl geçebiliriz?
That1Guy

114

Standart yapıcıyı kullanarak bir UIAlert oluşturabilirsiniz, ancak 'eski' olanı işe yaramıyor gibi görünüyor:

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

8
UIAlertView kullanımdan kaldırıldı. Bunun yerine UIAlertController öğesini tercih edilen bir UIAlertControllerStyleAlert stiliyle kullanın.
Zorayr

16
@Zorayr UIAlertController yalnızca iOS 8'den itibaren kullanılabilir, lütfen kullanımını önerirken de belirtin. İOS7 desteğinin hala istendiği durumlar vardır ve insanlar sorunu özleyebilir. Kullanımdan kaldırma, "artık bunu kullanma" anlamına gelmez.
Sami Kuhmonen

2
Bu, uygulamanız hala iOS 7'yi hedefliyorsa çalışır. Ancak, ideal olarak UIAlertView yalnızca UIAlertController kullanılamadığında kullanılmalıdır. NSClassFromString ("UIAlertController")! = nil {/ * UIAlertController * /} kullanın {/ * UIAlertView * /} kullanın
phatblat

UIAlertview () artık iOS 9'da kullanımdan kaldırıldı
Rizwan Ahmed

31

Swift 4.2 ve Xcode 10'da

Yöntem 1 :

BASİT UYARI

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

Yöntem 2:

PAYLAŞILMIŞ SINIF İLE UYARI

Paylaşılan sınıf stilini istiyorsanız (Bir kez yaz, her yerde kullanın)

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

Şimdi her eşyada şu şekilde uyarı çağırın

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

Yöntem 3:

SUNULAN TÜM PENCERELERİN EN İYİSİ

Tüm görünümlerin üstünde uyarı göstermek istiyorsanız bu kodu kullanın

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

İşlev çağırma

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

Yöntem 4:

Uzantı ile Uyarı

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

Şimdi böyle ara

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

Yöntem 5:

TEKSTİL İLE UYARI

Uyarmak için metin alanları eklemek istiyorsanız.

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

}

Yöntem 6:

Uzantılı SharedClass'ta Uyarı

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

Şimdi doğrudan bu şekilde arayın

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

Yöntem 7:

Uyarı için ayrı bir sınıfta Uzantı ile dışarıda paylaşılan sınıf ile uyarı.

Yeni bir Swift sınıfı oluşturun ve import UIKit. Kodu kopyalayıp yapıştırın.

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

Şimdi tüm sınıflarınızda bu şekilde uyarı işlevini çağırın (Tek satır).

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

O nasıl....


Perfekt! +1 Lütfen entegre zaman aşımı olan bir yöntem ekleyebilir misiniz? Teşekkürler!
PascalS

@ Passe, üzgünüm anlayamıyorum, lütfen kısaca açıklayabiliriz.
iOS

'Tamam' düğmesine tıklanıncaya veya bir zaman aşımı oluşana kadar sunulan bir alertController gerekir. Yöntem 6 veya 7 gibi ama ek bir giriş değişkeni 'zaman aşımı' olan bir şey.
PascalS

uzantı UIViewController {func alertWithTime (title: String, msg: String, timeInterval: TimeInterval) {DispatchQueue.main.async {let alert = UIAlertController (başlık: başlık, mesaj: msg, prefererstyle: .alert) alert.addAction (UIAlertAction (title) : "Tamam", stil: .default, handler: nil)) self.present (uyarı, animated: true, tamamlanma: nil) #available ise (iOS 10.0, *) {Timer.scheduledTimer (withTimeInterval: timeInterval, tekrarlar: false , blok: {_ alert.dismiss (animated: true, tamamlanma: nil)})} else {// önceki sürümlerde geri dönüş}}}}
iOS

1
Bu durumda timeInterval 0'dan bahsederseniz, uyarıyı kapatmak istemiyorsanız if koşulunu kullanın. 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

Görünüm Tıklaması

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

}

İki düğme ile tamamlandı Tamam ve İptal


12

İOS 7 ve 8'i hedefliyorsanız , her sürüm için doğru yöntemi kullandığınızdan emin olmak için böyle bir şeye ihtiyacınız vardır, çünkü UIAlertViewiOS 8'de kullanımdan kaldırılmıştır, ancak UIAlertControlleriOS 7'de mevcut değildir:

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

Ya da zaman kazanabilir ve UIAlertViewiOS 7 için desteği bırakana kadar kullanabilirsiniz . Apple, bunun için uygulamanızı reddetmez.
cprcrack

2
Kullanımdan kaldırma, "bunu kullanma" anlamına gelmez veya "yanlış yöntem" olacağı anlamına gelmez, yalnızca daha sonra çalışmayacağı anlamına gelir. Temel uyarılara ihtiyaç duyulursa özellikle iOS8'de UIAlertController'ı kullanmaya gerek yoktur. Daha önce olduğu gibi çalışacaklar. İOS4 veya 5'te kullanımdan kaldırılan ve yine de iOS8'de çalışan birçok API var. Ancak elbette daha yüksek bir iOS seviyesini hedefleyen uygulamalar bunları kullanmamalıdır ve bu nedenle bir kullanımdan kaldırma uyarısı vardır.
Sami Kuhmonen

1
@SamiKuhmonen Hayır, ancak yaptığınız işi neden yaptığınızı daha net hale getiriyor ve minimum sürümünüz yeteri kadar yüksek olduğunda kullanımdan kaldırılan yöntemlere yönelik desteğin kaldırılmasını kolaylaştırıyor.
AstroCB

12

Swift 2 protokol uzantıları ile görünüm denetleyicilerinize varsayılan bir uygulama sağlayan bir protokol oluşturabilirsiniz:

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
Mükemmel çalışıyor. Swift3 için 'presentViewController'ı' present 'olarak değiştirin.
Vincent

11

Hızlı bir dilde UIAlertView göster: -

Protokol UIAlertViewDelegate

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

Hızlı dilde UIAlertViewController göster: -

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

Yapıcıda otherButtonTitles sağlamayın.

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

alertView.show()

Ancak Oscar ile aynı fikirdeyim, bu sınıf iOS 8'de kullanımdan kaldırıldı, bu nedenle yalnızca iOS 8 uygulaması yapıyorsanız UIAlertView kullanamazsınız. Aksi takdirde yukarıdaki kod işe yarayacaktır.


9

Bunu buldum,

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

olsa iyi değil, ama işe yarıyor :)

Güncelleme:

ancak başlık dosyasında şu şekilde buldum:

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

Birisi bunu açıklayabilir.


Görünüşe göre UIAlertView, iOS 8'de kullanımdan kaldırıldı ve artık UIAlertController'ı tercih edilen bir UIAlertControllerStyleAlert stiliyle kullanıyoruz.
BlueBear

6
İOS7.1 ile geriye dönük olarak uyumlu olması gereken bir uygulama çalıştırırsanız ve Swift'te yazıyorsanız, UIAlertController hedef cihazı kilitler. İOS7 için eski UIAlertView'leri desteklemeniz gerekir.
Joe

Bir çökmeye neden olacak Swift değil, daha ziyade UIAlertController'ın iOS 8'den önce mevcut olmaması gerçeği
Frédéric Adda

7

İçin SWIFT4 , ben uzanan, düşünmek UIViewControllerve en zarif yolu yeniden kullanılabilir bir onay kontrolünü edilir yaratır.

UIViewControllerAşağıdaki gibi genişletebilirsiniz :

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

Sonra istediğiniz zaman kullanabilirsiniz:

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

Sadece bir kod yığını yazmak çok yararlı değildir. Herhangi bir soruyu cevaplarken (özellikle kabul edilmiş bir cevap da dahil olmak üzere çeşitli cevapları olan eski bir soru) bir kod parçasından daha fazlasını yazın. Lütfen kodunuzun ne yaptığına, soruyu nasıl cevapladığına ve diğer cevaplardan nasıl farklı (veya daha iyi) olduğuna dair bir açıklama ekleyin.
AdrianHHH

5

Başka bir numaram var. Bir oturum kapatma uyarısının uygulanacağı 5 sınıfınız olduğunu varsayalım. Swift sınıfı uzantısını deneyin.

Dosya- Yeni- Swift sınıfı- Adlandırın.

Aşağıdakileri ekleyin:

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

Şunları kullanarak uygulayın: self.makeLogOutAlert (). Umarım yardımcı olur.


5

Bunu uygulamanızın herhangi bir yerinden kullanmak için tek bir sınıf oluşturdum: https://github.com/Swinny1989/Swift-Popups

Ardından, bunun gibi birden çok düğmeyle bir açılır pencere oluşturabilirsiniz:

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

veya bunun gibi tek bir düğmeyle pop-up'lar:

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

Teşekkürler. Orada bazı sorunlar gönderirim
djdance

1
Hey @ Swinny89 Bu çözümü bizimle paylaştığınız için çok teşekkürler! Kapanma ile takıldım ve sen beni kurtardın!
Bruno Campos

5

Hızlı 3

Aşağıda, Swift 3 ile tek bir düğmeyle basit bir uyarının nasıl oluşturulacağına basit bir örnek verilmiştir.

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

Yukarıdaki örnekte, bir düğmeyle bir uyarı görünümünün varsayılan davranışı, düğme tıklandığında kaybolacağı için eylemin tanıtıcı geri çağrısı atlanmıştır.

"Alert.addAction (action)" ile uyarıya eklenebilecek başka bir işlemin nasıl oluşturulacağı aşağıda açıklanmıştır. Farklı stiller .default, .destructive ve .cancel'dir.

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

4

UIAlertViewHatasız derlemek için aşağıdaki başlatma kodunu aldım (son şey, varyadic bölüm belki de zor). Ama sınıf self(delege olarak geçiyorum) UIAlertViewDelegatederleme hataları gidermek için protokolü kabul emin olmak zorunda kaldı:

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

Bu arada, (Xcode 6.4 itibariyle) aldığım hata budur:

'UIAlertView' türü için 'tür bağımsız değişken listesini kabul eden bir başlatıcı bulunamıyor (title: String, message: String, delegate: MyViewController, cancelButtonTitle: String, otherButtonTitles: String)'

Diğerlerinin de belirttiği gibi, iOS 8.x + 'yı hedefleyebiliyorsanız UIAlertController'a geçmelisiniz. İOS 7'yi desteklemek için yukarıdaki kodu kullanın (iOS 6, Swift tarafından desteklenmez).


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

Bu basit uzantıyı n sayıda düğme ve swift4 ve üstü ile ilişkili eylemlerle kullanabilirsiniz

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

şöyle kullanabilirsiniz,

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

lütfen yinelenen cevaplar göndermeyin. Cevabınızı düzenlemek istiyorsanız.
iOS

Mükemmel cevap. Buna ihtiyacım var. Teşekkür ederim!
Gregory Wilson Pullyattu

3

İşleve ilettiğiniz bir değer doğru olmadığından, bunun işe yaramamasının nedeni. swift, Objective-C'yi sevmez, herhangi bir kısıtlama olmaksızın sınıf tipi olan argümanlara nil koyabilirsiniz (olabilir). OtherButtonTitles bağımsız değişkeni, türünün sonunda (?) Bulunmayan isteğe bağlı olmayan olarak tanımlanır. bu yüzden buna somut bir değer iletmelisiniz.


3
@IBAction func Alert(sender: UIButton) {

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

    alertView.show()

}

Bunu dene


3

Bir uyarı görünümü görüntülemek için bu kodu kullanın

  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)

Referans: UIAlertController kullanarak Swift Gösterisi Uyarısı


3

xcode 9'da

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 için aşağıdaki gibi bir uzantı oluşturun:

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

Şimdi ViewController'ınızda, yukarıdaki işlevi UIViewController tarafından sağlanmış gibi doğrudan çağırın.

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

Genellikle, kodun ne yapmak istediği ve başkalarını tanıtmadan sorunu neden çözdüğüne dair bir açıklama içeriyorsa, cevaplar çok daha yararlıdır. Yanıtlayıcının referans değerini iyileştirdiğiniz ve daha anlaşılır hale getirdiğiniz için teşekkür ederiz!
Tim Diekmann

2

bunu dene. Körük Kodunu Düğmeye Koy.

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

İşte Swift'te komik bir örnek:

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

İşte Swift'te AlertView'ün oldukça basit bir işlevi:

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

    }

İletiyi bu işlevi kullandığınız bir String olarak iletmeniz gerekir.


1

Eski Yol: 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 {

    // ...
   }
  }

Yeni Yol: 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'da bunu yapabilirsiniz

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 İçin Genel Sınıf

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

Kullanın: -

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

Gönderdiğiniz koda açıklama ekleyebilir misiniz? Şu an olduğu gibi, cevabınız gerçekten SO kuralları tarafından iyi bir cevap olarak nitelendirilmiyor.
Nico Van Belle

uyarı görünümü hızlı bir şekilde değişti 4.kullanım uyarı denetleyicisi
Sandeep Singh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.