ios - स्विफ्ट में मैं UIAlertView कैसे बनाऊंगा?




swift cocoa-touch (18)

मैं स्विफ्ट में UIAlertView बनाने के लिए काम कर रहा हूं, लेकिन किसी कारण से मुझे कथन सही नहीं मिल रहा है क्योंकि मुझे यह त्रुटि मिल रही है:

'Init' के लिए अधिभार नहीं मिला जो आपूर्ति किए गए तर्क स्वीकार करता है

यहां बताया गया है कि मैंने यह कैसे लिखा है:

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

फिर इसे कॉल करने के लिए मैं उपयोग कर रहा हूँ:

button2Alert.show()

फिलहाल यह क्रैश हो रहा है और मुझे सिंटैक्स सही नहीं लगता है।


एक बटन

class ViewController: UIViewController {

    @IBAction func showAlertButtonTapped(_ sender: UIButton) {

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

        // add an action (button)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.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: UIAlertControllerStyle.alert)

        // add the actions (buttons)
        alert.addAction(UIAlertAction(title: "Continue", style: UIAlertActionStyle.default, handler: nil))
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.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: UIAlertControllerStyle.alert)

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

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

हैंडलिंग बटन टैप्स

उपरोक्त उदाहरणों में handler nil था। जब उपयोगकर्ता एक बटन टैप करता है तो आप कुछ करने के closure साथ nil को प्रतिस्थापित कर सकते हैं। उदाहरण के लिए:

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

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

}))

टिप्पणियाँ

  • एकाधिक बटनों को अलग-अलग UIAlertActionStyle प्रकारों का उपयोग करने की आवश्यकता नहीं है। वे सभी .default हो सकता है।
  • तीन से अधिक बटनों के लिए एक्शन शीट का उपयोग करने पर विचार करें। सेटअप बहुत समान है। यहाँ एक उदाहरण है।

// UIAlertView के लिए जेनेरिक क्लास

//MARK:- MODULES
import Foundation
import UIKit

//MARK:- CLASS
class Alert  : NSObject{

static let shared = Alert()

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

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

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

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

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

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

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

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

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

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

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

उपयोग:-

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

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

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

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

इसे इस्तेमाल करे। बटन में बोले कोड डालें।

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

एक चेतावनी दृश्य प्रदर्शित करने के लिए इस कोड का प्रयोग करें

  let alertController = UIAlertController(title: "Hello  Coders", message: "your alert message", preferredStyle: .Alert)
        let defaultAction = UIAlertAction(title: "Close Alert", style: .Default, handler: nil)
        alertController.addAction(defaultAction)

        presentViewController(alertController, animated: true, completion: nil)

संदर्भ: UIAlertController का उपयोग कर स्विफ्ट शो अलर्ट


ओल्ड वे: यूआईएलर्टव्यू

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 {

    // ...
   }
  }

द न्यू वे: यूआईएलर्ट कंट्रोलर

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

कारण यह काम नहीं करता है क्योंकि आप फ़ंक्शन में पास किए गए कुछ मान सही नहीं हैं। स्विफ्ट उद्देश्य-सी पसंद नहीं करता है, आप तर्कों के लिए शून्य डाल सकते हैं जो किसी भी प्रतिबंध के बिना कक्षा प्रकार हैं (हो सकता है)। तर्क अन्य बटनटन को गैर-वैकल्पिक के रूप में परिभाषित किया गया है, जिसका प्रकार इसके अंत में (?) नहीं है। तो आपको इसके लिए एक ठोस मूल्य पारित करना होगा।


बस कन्स्ट्रक्टर में अन्य बटन टाइटल्स प्रदान न करें।

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

alertView.show()

लेकिन मैं ऑस्कर से सहमत हूं, इस वर्ग को आईओएस 8 में बहिष्कृत किया गया है, इसलिए यदि आप आईओएस 8 केवल ऐप कर रहे हैं तो यूआईएलर्टव्यू का कोई उपयोग नहीं होगा। अन्यथा ऊपर दिया गया कोड काम करेगा।


मुझे त्रुटियों के बिना संकलित करने के लिए निम्नलिखित UIAlertView प्रारंभिक कोड मिला है (मुझे लगता है कि आखिरी, अलग-अलग हिस्सा शायद मुश्किल है)। लेकिन मुझे यह सुनिश्चित करना था कि self की श्रेणी (जिसे मैं प्रतिनिधि के रूप में गुजर रहा हूं) संकलन त्रुटियों के लिए UIAlertViewDelegate प्रोटोकॉल को अपनाना था:

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

वैसे, यह वह त्रुटि है जो मुझे मिल रही थी (एक्सकोड 6.4 के रूप में):

'UIAlertView' टाइप करने के लिए प्रारंभकर्ता नहीं मिला है जो कि 'प्रकार का एक तर्क सूची स्वीकार करता है' (शीर्षक: स्ट्रिंग, संदेश: स्ट्रिंग, प्रतिनिधि: MyViewController, रद्द बटन बटन: स्ट्रिंग, अन्य बटन टाइटल: स्ट्रिंग) '

जैसा कि अन्य ने उल्लेख किया है, यदि आप आईओएस 8.x + को लक्षित कर सकते हैं तो आपको यूआईएलर्ट कंट्रोलर पर माइग्रेट करना चाहिए। आईओएस 7 का समर्थन करने के लिए, उपरोक्त कोड का उपयोग करें (आईओएस 6 स्विफ्ट द्वारा समर्थित नहीं है)।


मैंने आपके ऐप में कहीं से भी इसका उपयोग करने के लिए एक सिंगलटन क्लास बनाया है: 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:

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

मैंने यह पाया,

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

कोई इसे समझा सकता है।


स्विफ्ट 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!")
    }
}

स्विफ्ट में एक मजाकिया उदाहरण यहां दिया गया है:

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

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

        }
    }

आईओएस 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)

स्विफ्ट 3

स्विफ्ट 3 के साथ एक बटन के साथ सरल अलर्ट कैसे बनाएं, इसका एक सरल उदाहरण निम्नलिखित है।

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

उपर्युक्त उदाहरण में कार्रवाई के हैंडल कॉलबैक को छोड़ दिया गया है क्योंकि बटन क्लिक होने पर एक बटन के साथ अलर्ट व्यू का डिफ़ॉल्ट व्यवहार गायब हो जाता है।

यहां एक और क्रिया बनाने का तरीका बताया गया है, जिसे "alert.addAction (action)" के साथ अलर्ट में जोड़ा जा सकता है। विभिन्न शैलियों हैं .default, .destructive और .cancel।

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

स्विफ्ट में अलर्ट व्यू का एक बहुत ही सरल कार्य यहां दिया गया है:

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

    }

आपको एक स्ट्रिंग के रूप में संदेश पास करना होगा जहां आप इस फ़ंक्शन का उपयोग करते हैं।


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

 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)

}




uialertcontroller