7

ホーム画面から3Dタッチショートカットを使用しているときに、別のView Controllerに分割しようとしています。UITabBarControllerとUINavigationBarControllerに埋め込まれたViewViewControllerの例

アプリケーションはUITabBarControllerに組み込まれており、各タブルートコントローラはUINavigationControllerです。

ショートカットを処理して各ショートカットのビューコントローラをロードしようとした方法を次に示します。このコードで

private func handleShortcutItem(shortcutItem: UIApplicationShortcutItem) { 

    if let rootViewController = window?.rootViewController, let shortcutItemType = ShortcutItemType(shortcutItem: shortcutItem) { 
    let sb = UIStoryboard(name: "main", bundle: nil) 

     let helloVC = sb.instantiateViewControllerWithIdentifier("HelloVC") as! HelloViewController 
     let goodbyeVC = sb.instantiateViewControllerWithIdentifier("GoodbyeVC") as! GoodbyeViewController 

     switch shortcutItemType { 
     case .Hello: 
      rootViewController.presentViewController(helloVC, animated: true, completion: nil) 
      break 
     case .Goodbye: 
      rootViewController.presentViewController(goodbyeVC, animated: true, completion: nil) 
      break 
     } 
    } 
} 

ショートカットは、初期ビューコントローラへとしない別のタブにあるhelloVCgoodbyeVCコントローラにアプリケーションを開きます。

ロードしようとしているViewControllersUINavigationControllerに埋め込まれ、UITabBarControllerに埋め込まれているため、これが原因であると推測しています。

UITabBarControllerUINavigationControllerに埋め込まれているpresentViewControllerはどうすればいいですか?

UPDATE

私は気圧私と一緒にiPhone 6Sを持っていないように私は次のように動作するかどうか不明です。しかし、コードを次のように変更しました。うまくいけば、3D Touch Actionが実行されたときに選択されたタブインデックスが読み込まれることを願っています。そこから、Segueを実行するための通知をView Controllerに通知する必要があります。

private func handleShortcutItem(shortcutItem: UIApplicationShortcutItem) { 

    if let rootViewController = window?.rootViewController, let shortcutItemType = ShortcutItemType(shortcutItem: shortcutItem) { 
     let tababarController = rootViewController as! UITabBarController 

     switch shortcutItemType { 
     case .Hello: 
      tababarController.selectedIndex = 1  
      NSNotificationCenter.defaultCenter().postNotificationName("performsegueHello", object: nil) 
      break 
     case .Goodbye: 
      tababarController.selectedIndex = 4 
      NSNotificationCenter.defaultCenter().postNotificationName("performsegueGoodbye", object: nil) 
      break 
     } 
    } 
} 
+0

あなたはrootViewController.presentViewController(helloVCは、アニメーション:真、完了:ゼロ)ことを確認しまし またはrootViewController.presentViewController(goodbyeVC、アニメーション:真を、完了:ゼロ)が呼び出さなっていますか? – beyowulf

+0

「コーディネーター」パターンと呼ばれるものを調べましたか?モバイルアプリ内でナビゲーションをカプセル化する便利な方法です。 http://iamsim.me/the-coordinator-pattern/ –

答えて

1

次のコードを試してください。私はあなたがタブバーのナビゲーションコントローラに到達していないと思います。あなたはこれを次のようにすることができます: let insideNvc = tvc?.selectedViewController as?

ここでは、あなたの上に何かを表示したり押すことができるナビゲーションコントローラがあります。

private func handleShortcutItem(shortcutItem: UIApplicationShortcutItem) { 

let nvc = self.window?.rootViewController as? UINavigationController 
let tvc = nvc?.topViewController as? TabBarController 
let insideNvc = tvc?.selectedViewController as? UINavigationController 

if let shortcutItemType = ShortcutItemType(shortcutItem: shortcutItem) { 
let sb = UIStoryboard(name: "main", bundle: nil) 

    let helloVC = sb.instantiateViewControllerWithIdentifier("HelloVC") as! HelloViewController 
    let goodbyeVC = sb.instantiateViewControllerWithIdentifier("GoodbyeVC") as! GoodbyeViewController 

    switch shortcutItemType { 
    case .Hello: 
     insideNvc?.presentViewController(helloVC, animated: true, completion: nil) 
     break 
    case .Goodbye: 
     insideNvc?.presentViewController(goodbyeVC, animated: true, completion: nil) 
     break 
    } 
} 

}

関連する問題