2016-10-30 15 views
0

私は成功したアプリデリゲートにこのコードを使用して、ホーム画面から3Dタッチのショートカットを実装しました:3Dタッチ:現在のVCから提示

@objc(application:performActionForShortcutItem:completionHandler:) @available(iOS 9.0, *) 
func application (_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler completionHandle: @escaping (Bool) -> Void) { 
    if shortcutItem.type == "com.myAppName.addtask" { 
     let storyBoard = UIStoryboard(name: "Main", bundle: nil) 
     let editorVC = storyBoard.instantiateViewController(withIdentifier: "myVC_ID") as! myVC_Class 
     let rootVC = UIApplication.shared.keyWindow?.rootViewController 
     rootVC?.present(editorVC, animated: false, completion: {() -> Void in 
      completionHandle(true) 
     }) 
    } 
} 

はしかし、問題は、それが常にから提示を期待するということですルートviewController。ユーザーがアプリにあったし、最後のビューがルートVC、ホーム画面からショートカットだった場合

Warning: Attempt to present xxx on (xxxx.ViewController: 0x7f9acc83e000) whose view is not in the window hierarchy!

:ユーザーが別のVCからアプリを残して、ショートカットをしようとすると、私はこのエラーを取得しますよく働く。それでは、どのようにしてVCを最後に使用したかにかかわらず、それをうまく動作させる方法は?

答えて

1

あなたがしていることの原則は絶対に正しいです。ではなぜそれは機能していないのですか?すべてのアクションは、その中に起こる - 私はどうなるのか

は、ウィンドウのルートビューコントローラ決してがずれますコンテナビューコントローラを作成しています。このように、ウィンドウのルートビューコントローラがウィンドウ階層にない唯一の方法は、それが提示されたビューコントローラを持っていることです。表示されたビューコントローラがあるかどうかを調べることで簡単に見つけ出すことができます。表示されている場合は、からに存在します。

+0

ありがとうございました。私はそれが私の質問だと思うが、シナリオは、ルートビューコントローラがVC2を提示していることを知っている、その後、ユーザーは、3D Touchのショートカットに戻ろうとすると、そのエラーメッセージが表示されます。だから私は自分のコードを他のVC ORから提示するように変更するにはどうしたらよいですか?これはさらに元気で、元のVCに戻ってコールしてからそれを提示します。 –

+0

ええと、 'presentViewController'について尋ねますか?これはトリックの質問ですか? – matt

+0

最後のコメントは、削除したばかりです。それは今働いている。ありがとうございました。 –

関連する問題