2015-05-05 6 views
10

UIAlertController'ımı görüntüleyemiyorum çünkü bunu ViewController olmayan bir Sınıfta göstermeye çalışıyorum.ViewController dışında UIAlertController göster

çalışmıyor
var alertController = UIAlertController(title: "Title", message: "Message", preferredStyle: .Alert) 

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

... Henüz benim için çalışan herhangi bir çözüm bulamadık:

Zaten ekleyerek çalıştı.

+0

Artık bir UIViewController sınıfı olmayan sınıfınız, kısmen yoksayılabilir. Bu sınıfı kullanan görünüm denetleyicisindeki uyarıyı görüntülemek için temsilci veya blok tabanlı bir geri arama eklemeyi düşünün. – 3lvis

cevap

27

için bildirim eklemek geri show() getirmek UIAlertController üzerinden bu extension yazdı.
Mevcut üstten görünüm denetleyicisi bulmak için yineleme kullandığında: o kadar kolay Şimdi

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

olarak:

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

DÜZENLEME: Xcode 8.0 için

& Swift 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

Bu harika! Çok teşekkürler – Michael

+0

Sizin için işe yaradığıma sevindim, pek çok VC senaryosunda (bir sekme çubuğu denetleyicisinin içindeki bir nav yığınında modal vc ile) kullanıyorum, lütfen bunun işe yaramadığı bir durum varsa lütfen bana bildirin. .. –

+0

SharedApplication bir Uygulama Uzantısı'nda kullanılamaz. – SAHM

0

Eğer geçerli görünüm denetleyicisinden dediğimiz bir yardımcı işlev oluşturun ve parametre olarak geçerli görünüm denetleyicisi pass:

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

o anda pencere olmadığını ait çünkü çözümü muhtemelen çalışmıyorsa . Ben application:DidFinishLoadingWithOptions yönteminde uyarı görünümü göstermeye çalışırken aynı sorun vardı. Bu durumda benim çözüm kök görünümü denetleyicisi müsait olup olmadığını kontrol etmek, ve eğer o değil, o UIApplicationDidBecomeActiveNotification

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

Bu işe yaramalı.

UIApplication.sharedApplication().windows[0].rootViewController?.presentViewController(...)