2016-04-06 9 views
1

完了したら警告を表示するタイマーがあります。 このアラートビューは、ユーザーが現在であるビューコントローラに提示しなければならない現在アクティブなUIViewControllerのUIAlertController

私の気持ちは、これははるかに効果的で、次のよりも達成することができるされています。

私は今これをやっている方法が提供されます私の5つのView Controllerのそれぞれへの通知のためのオブザーバー、およびそのアラートを作成して提示するメソッド。

アラートを一度しか設定しないで、現在アクティブなビューコントローラに表示する方法はありますか?任意のアイデアを

// I've got the following in each of my view controllers. 

// In viewDidLoad() 
override func viewDidLoad() { 
    super.viewDidLoad() 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(SonglistViewController.presentSleepTimerFinishedAlert(_:)), name: "presentSleepTimerFinishedAlert", object: nil) 
} 


func presentTimerFinishedAlert(notification: NSNotification) { 
    let alertController = UIAlertController(title: "Timer finished", message: nil, preferredStyle: UIAlertControllerStyle.Alert) 
    alertController.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) 
    presentViewController(alertController, animated: true, completion: nil) 
} 

おかげでたくさん:

は、ここに私のコードです!

答えて

1

トップViewControllerはナビゲーションスタックにあり、そこでAlertControllerを直接表示できます。あなたは、アプリケーション内のどこからでもトップViewControllerを見つけるために、ここに掲載拡張メソッドを使用することができます。

https://stackoverflow.com/a/30858591/2754727

+0

を返すようにelse ifケースを追加する必要があり、魔法のように動作します!どうもありがとう! – nontomatic

1

それは本当にあなたのナビゲーションスキーマに依存します。 まず、現在のVCが必要です。ナビゲーションコントローラーとしてルートビューコントローラーを持っていて、モーダルを表示していない場合は、rootVCから現在のVCを取得できます。混在したナビゲーションがある場合。つまり、タブバーとナビゲーションコントローラを内部に持ち、可能ないくつかのモーダルを使って、現在のVCを検索して返すAppDelegateに拡張を書くことができます。

ここでは、このタイマークラスのどこかにピンを設定する必要があります。これはシングルトンでも、どこかに固定することもできます。このタイマークラスよりも、タイマーが終了すると、現在のVC(AppDelegateの拡張メソッドを使用するか、ルートナビゲーションコントローラーを参照)を表示して、その上に警告を表示できます。これにより

1
extension UIApplication { 
    /// The top most view controller 
    static var topMostViewController: UIViewController? { 
     return UIApplication.shared.keyWindow?.rootViewController?.visibleViewController 
    } 
} 

extension UIViewController { 
    /// The visible view controller from a given view controller 
    var visibleViewController: UIViewController? { 
     if let navigationController = self as? UINavigationController { 
      return navigationController.topViewController?.visibleViewController 
     } else if let tabBarController = self as? UITabBarController { 
      return tabBarController.selectedViewController?.visibleViewController 
     } else if let presentedViewController = presentedViewController { 
      return presentedViewController.visibleViewController 
     } else { 
      return self 
     } 
    } 
} 

注意するので

UIApplication.topMostViewController?.present(alert, animated: true, completion: nil) 

ことの一つは、現在表示されているUIAlertControllerがありますならば、UIApplication.topMostViewControllerUIAlertControllerを返すことであるように、あなたは簡単にアラートを提示することができます。 UIAlertControllerの上に提示することは奇妙な動作をしており、避けるべきです。そのように、あなたは手動で提示する前!(UIApplication.topMostViewController is UIAlertController)ことを確認するか、完璧だnilの場合self is UIAlertController

extension UIViewController { 
    /// The visible view controller from a given view controller 
    var visibleViewController: UIViewController? { 
     if let navigationController = self as? UINavigationController { 
      return navigationController.topViewController?.visibleViewController 
     } else if let tabBarController = self as? UITabBarController { 
      return tabBarController.selectedViewController?.visibleViewController 
     } else if let presentedViewController = presentedViewController { 
      return presentedViewController.visibleViewController 
     } else if self is UIAlertController { 
      return nil 
     } else { 
      return self 
     } 
    } 
} 
関連する問題