2015-05-05 9 views
10

मुझे अपना यूआईएलर्ट कंट्रोलर प्रदर्शित करने में परेशानी है क्योंकि मैं इसे कक्षा में दिखाने की कोशिश कर रहा हूं जो व्यू कंट्रोलर नहीं है।ViewController के बाहर UIAlertController दिखाएं

var alertController = UIAlertController(title: "Title", message: "Message", preferredStyle: .Alert) 

UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alertController, animated: true, completion: nil) 

कौन सा काम नहीं कर रहा ... मैं किसी भी समाधान है कि मेरे लिए अभी तक काम किया नहीं मिला:

मैं पहले से ही इसे जोड़ने की कोशिश की।

+0

आप कक्षा हैं जो UIViewController नहीं है अब आंशिक रूप से अवांछित है। इस वर्ग का उपयोग कर रहे व्यू कंट्रोलर पर अलर्ट प्रदर्शित करने के लिए एक प्रतिनिधि या ब्लॉक आधारित कॉलबैक जोड़ने पर विचार करें। – 3lvis

उत्तर

27

सूचना जोड़ना मैं वापस show() लाने के लिए UIAlertController पर इस extension लिखा था।
यह वर्तमान शीर्ष दृश्य नियंत्रक को खोजने के लिए प्रत्यावर्तन का उपयोग करता है: अब

extension UIAlertController { 

    func show() { 
     present(animated: true, completion: nil) 
    } 

    func present(#animated: Bool, completion: (() -> Void)?) { 
     if let rootVC = UIApplication.sharedApplication().keyWindow?.rootViewController { 
      presentFromController(rootVC, animated: animated, completion: completion) 
     } 
    } 

    private func presentFromController(controller: UIViewController, animated: Bool, completion: (() -> Void)?) { 
     if let navVC = controller as? UINavigationController, 
      let visibleVC = navVC.visibleViewController { 
       presentFromController(visibleVC, animated: animated, completion: completion) 
     } else 
     if let tabVC = controller as? UITabBarController, 
      let selectedVC = tabVC.selectedViewController { 
       presentFromController(selectedVC, animated: animated, completion: completion) 
     } else { 
      controller.presentViewController(self, animated: animated, completion: completion); 
     } 
    } 
} 

यह रूप में आसान है के रूप में:

var alertController = UIAlertController(title: "Title", message: "Message", preferredStyle: .Alert) 
alertController.show() 

संपादित करें:

Xcode 8.0 के लिए & स्विफ्ट 3:

extension UIAlertController { 

    func show() { 
     present(animated: true, completion: nil) 
    } 

    func present(animated: Bool, completion: (() -> Void)?) { 
     if let rootVC = UIApplication.shared.keyWindow?.rootViewController { 
      presentFromController(controller: rootVC, animated: animated, completion: completion) 
     } 
    } 

    private func presentFromController(controller: UIViewController, animated: Bool, completion: (() -> Void)?) { 
     if let navVC = controller as? UINavigationController, 
      let visibleVC = navVC.visibleViewController { 
      presentFromController(controller: visibleVC, animated: animated, completion: completion) 
     } else 
      if let tabVC = controller as? UITabBarController, 
       let selectedVC = tabVC.selectedViewController { 
       presentFromController(controller: selectedVC, animated: animated, completion: completion) 
      } else { 
       controller.present(self, animated: animated, completion: completion); 
     } 
    } 
} 
+0

यह बहुत अच्छा है! बहुत बहुत धन्यवाद – Michael

+0

खुशी है कि यह आपके लिए काम करता है, मैं इसे कई वीसी परिदृश्यों (एक टैब बार नियंत्रक आदि के अंदर एक एनवी स्टैक पर मोडल वीसी) के साथ उपयोग कर रहा हूं, कृपया मुझे बताएं कि क्या ऐसी स्थिति है जहां यह काम नहीं करती है। .. –

+0

साझा अनुप्रयोग का उपयोग ऐप एक्सटेंशन में नहीं किया जा सकता है। – SAHM

0

एक सहायक समारोह है कि आप वर्तमान दृश्य नियंत्रक से फोन बनाने और एक पैरामीटर के रूप वर्तमान दृश्य नियंत्रक पारित:

func showAlertInVC(
    viewController: UIViewController, 
    title: String, 
message: String) 
{ 
    //Code to create an alert controller and display it in viewController 
} 
0

समाधान उस पल में कोई खिड़की है की वजह से वहाँ यह शायद काम नहीं कर रहा । मुझे एक ही समस्या थी जब मैं application:DidFinishLoadingWithOptions विधि में अलर्ट व्यू दिखाने की कोशिश कर रहा था। इस मामले में मेरी समाधान करता है, तो रूट दृश्य नियंत्रक उपलब्ध है की जाँच करने के लिए था, और अगर ऐसा नहीं है, तो के लिए UIApplicationDidBecomeActiveNotification

NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationDidBecomeActiveNotification, 
       object: nil, 
       queue: NSOperationQueue.mainQueue()) { 
        (_) in 
         //show your alert by using root view controller 
         //remove self from observing 
        } 
     } 
0

यह काम करना चाहिए।

UIApplication.sharedApplication().windows[0].rootViewController?.presentViewController(...) 
संबंधित मुद्दे