2016-11-17 12 views
4

Swift 3、Xcode 8.1。 UIViewControllerUIAlertControllerと表示したいiOS。ビューがウィンドウ階層にないUIViewControllerにUIAlertControllerを表示しようとしました

私は方法があります:

private static func rootViewController() -> UIViewController { 
    // cheating, I know 

    return UIApplication.shared.keyWindow!.rootViewController! 
} 

static func presentAlert(_ message: String) { 
    let alertView = UIAlertController(title: "RxExample", message: message, preferredStyle: .alert) 
    alertView.addAction(UIAlertAction(title: "OK", style: .cancel) { _ in }) 

    rootViewController().present(alertView, animated: true, completion: nil) 
} 

Full code of this class you can find here

を私はviewDidLoad方法presentAlert呼び出し:

override func viewDidLoad() { 
    super.viewDidLoad() 
    DefaultWireframe.presentAlert("test") 
    ... 
} 

と警告だ:

警告:時をUIViewController:0x7f904ac0d930をUIAlertControllerに提示しようとする誘惑:0x7f904ad08040ビューはウィンドウ階層にありません!

アラートを表示して警告を表示するにはどうすればよいですか?

初期ViewControllerで警告を表示しようとすると動作しますが、初期VCでプッシュセグを使用して接続された別のViewControllerでは動作しません。

+0

'UIAlertController'を表示しようとしている' rootViewController'が見えていて、別のモーダルビューコントローラで覆われていないことは確かですか? – dive

+0

このviewControllerのデバッグビューボタン(デバッグコンソールのバーにある)を押します。左側にはウィンドウ全体が一番上に表示されます。任意のビューを右クリックして、説明を印刷できます。これをrootViewController()のビューと比較してください。あなたのrootViewControllerのビューがもはや階層内にどうなっていないかを示すケースが必要です。そのビューを選択し、その代わりに使用します。 –

+0

すべてのソリューションが見つかりましたか?同じ問題に遭遇する。 –

答えて

16

あなたのアプリはビューコントローラをまだユーザに提示していないため、アラートを表示することはできません。 viewDidAppearでそのコードを実行してみてください

+0

ボタンのIBActionでこのメソッドを呼び出すと同じ結果になります。 –

+1

@karnett素晴らしい答えです。ありがとう –

3

他のViewControllerにプッシュされたViewControllerにアクションシートが表示されていなかったのと同様の問題がありました。それが与えていたエラーもあなたのものと似ていました。あなたが行ったことは、通常のViewControllerで完全に機能しますが、他のViewControllerにプッシュされるViewControllerでは機能しません。

クラスUIAlertControllerのオブジェクトをトリガー関数内でローカルにするのではなく、myクラスのインスタンス変数にすることで問題を解決しました。

だからあなたの場合には、インスタンス変数が宣言されたクラスの先頭にvar alertView: UIAlertController?を宣言しようとしてからちょうどこのようにそれを使用するために、ご希望のトリガ機能でそれを初期化:

static func presentAlert(_ message: String) { 
    self.alertView = UIAlertController(title: "RxExample", message: message, preferredStyle: .alert) 
    alertView.addAction(UIAlertAction(title: "OK", style: .cancel) { _ in }) 

    rootViewController().present(alertView, animated: true, completion: nil) 
} 

はからいくつかのバグかもしれませんこの問題を引き起こしていた参照を維持するAppleの側。しかし、私は周りの作品は完璧な上記の作品を書いた。