ios - AlertController खिड़की पदानुक्रम में नहीं है




swift storyboard (6)

आइए अपने विचार को पदानुक्रम पर देखें। आपके पास एक ViewController । फिर आप एक AlertController बना रहे हैं, आप इसे अपने पदानुक्रम में नहीं जोड़ रहे हैं और आप उस पर एक इंस्टेंस विधि कह रहे हैं, जो कि AlertController को सिर्फ एक अन्य नियंत्रक ( UIAlertController ) को दिखाने के लिए नियंत्रक के रूप में उपयोग करने का प्रयास करता है।

+ ViewController
    + AlertController (not in hierarchy)
        + UIAlertController (cannot be presented from AlertController)

अपने कोड को सरल बनाने के लिए

class ViewController: UIViewController {
   override func viewDidLoad() {
       super.viewDidLoad()  
   }

   @IBAction func showAlertButton(sender: AnyObject) {
       var alert = UIAlertController(title: "abc", message: "def", preferredStyle: .Alert)
       self.presentViewController(alert, animated: true, completion: nil)
   }
}

यह काम करेगा।

अगर आपको किसी AlertController लिए AlertController की आवश्यकता है, तो आपको इसे पहले पदानुक्रम में जोड़ना होगा, जैसे कि presentViewController का उपयोग करके या किसी अन्य presentViewController कॉल का उपयोग करना।

यदि आप चाहते हैं कि क्लास अलर्ट बनाने के लिए सिर्फ सहायक हो, तो उसे इस तरह दिखना चाहिए:

class AlertHelper {
    func showAlert(fromController controller: UIViewController) { 
        var alert = UIAlertController(title: "abc", message: "def", preferredStyle: .Alert)
        controller.presentViewController(alert, animated: true, completion: nil)
    }
}

कहा जाता है

 var alert = AlertHelper()
 alert.showAlert(fromController: self)

मैंने अभी ViewController क्लास के साथ एक सिंगल व्यू एप्लीकेशन प्रोजेक्ट बनाया है। मैं एक फ़ंक्शन से एक UIAlertController दिखाना चाहूंगा जो मेरी अपनी कक्षा के अंदर स्थित है।

यहाँ एक चेतावनी के साथ मेरी कक्षा है।

class AlertController: UIViewController {
     func showAlert() { 
         var alert = UIAlertController(title: "abc", message: "def", preferredStyle: .Alert)
         self.presentViewController(alert, animated: true, completion: nil)
     }
}

यहाँ ViewController है जो अलर्ट निष्पादित करता है।

class ViewController: UIViewController {
   override func viewDidLoad() {
       super.viewDidLoad()  
   }

   @IBAction func showAlertButton(sender: AnyObject) {
       var alert = AlertController()
       alert.showAlert()
   }
}

यह वही है जो मुझे खूबसूरत अलर्ट के बजाय मिलता है।

चेतावनी: वर्तमान में UIAlertController: 0x797d2d20 को Sprint1.AlertController पर प्रस्तुत करने का प्रयास करें: 0x797cc500 जिसका दृश्य विंडो पदानुक्रम में नहीं है!

मुझे क्या करना चाहिए?


आप किसी भी जगह से अलर्ट कॉल करने के लिए नीचे दिए गए फ़ंक्शन का उपयोग कर सकते हैं, बस AnyClass में इन विधि को शामिल करें

class func topMostController() -> UIViewController {
        var topController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController
        while ((topController?.presentedViewController) != nil) {
            topController = topController?.presentedViewController
        }
        return topController!
    }

    class func alert(message:String){
        let alert=UIAlertController(title: "AppName", message: message, preferredStyle: .alert);
        let cancelAction: UIAlertAction = UIAlertAction(title: "OK", style: .cancel) { action -> Void in

        }
        alert.addAction(cancelAction)
        AnyClass.topMostController().present(alert, animated: true, completion: nil);
    }

फिर कॉल करो

AnyClass.alert(message:"Your Message")

निम्नलिखित 3 पंक्तियाँ लिखिए, बस हमें यह करने की आवश्यकता है।

स्विफ्ट 3.0

private func presentViewController(alert: UIAlertController, animated flag: Bool, completion: (() -> Void)?) -> Void {
     UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: flag, completion: completion)
  }

स्विफ्ट 2.0

  private func presentViewController(alert: UIAlertController, animated flag: Bool, completion: (() -> Void)?) -> Void {
     UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alert, animated: flag, completion: completion)
  }

यदि आप अपने UIAlertController को मोडल कंट्रोलर से UIAlertController कर रहे हैं, तो आपको इसे UIAlertController जरूरत है, न कि viewDidLoad या आपको कोई त्रुटि मिलेगी।

यहाँ मेरा कोड है (स्विफ्ट 4):

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    let alertController = UIAlertController(title: "Foo", message: "Bar", preferredStyle: .alert)

    alertController.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
    present(alertController, animated: true, completion: nil)
}

यह मेरे लिए काम किया:

- (UIViewController *)topViewController{
  return [self topViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
}

- (UIViewController *)topViewController:(UIViewController *)rootViewController
{
  if (rootViewController.presentedViewController == nil) {
    return rootViewController;
  }

  if ([rootViewController.presentedViewController isMemberOfClass:[UINavigationController class]]) {
    UINavigationController *navigationController = (UINavigationController *)rootViewController.presentedViewController;
    UIViewController *lastViewController = [[navigationController viewControllers] lastObject];
    return [self topViewController:lastViewController];
  }

  UIViewController *presentedViewController = (UIViewController *)rootViewController.presentedViewController;
  return [self topViewController:presentedViewController];
}

कार्यान्वयन:

UIViewController * topViewController = [self topViewController];

अलर्ट के साथ उपयोग करना:

[topViewController presentViewController:yourAlert animated:YES completion:nil];

आप अपने ऐप में किसी भी वर्ग से अलर्ट भेज सकते हैं (जो UIKit का उपयोग करता है: #import <UIKit/UIKit.h> ))

स्रोत यहाँ


यहाँ Swift3 में एक Utility.swift क्लास (UIViewController नहीं) में UIAlertController का कोड है, धन्यवाद Mitsuaki!

private func presentViewController(alert: UIAlertController, animated flag: Bool, completion: (() -> Void)?) -> Void {
    UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: flag, completion: completion)
}
func warningAlert(title: String, message: String ){
    let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)
    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler:  { (action) -> Void in
    }))        
 //   self.present(alert, animated: true, completion: nil)
    presentViewController(alert: alert, animated: true, completion: nil)
}