0

2 つの異なる UISplitview コントローラーを使用して、2 つの異なるマスター/詳細情報セットを制御するユニバーサル アプリがあります (一方のデータ型が他方のデータ型にネストされています)。

次の関数を呼び出して、最初から別の関数に切り替えます。

@IBAction func viewEntries(sender: AnyObject) {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let entriesSplitView = storyboard.instantiateViewControllerWithIdentifier("entriesSplitView") as! UISplitViewController
    entriesSplitView.delegate = self.appDelegate
    UIView.transitionWithView(self.view.window!, duration: 0.25, options: .TransitionCrossDissolve, animations:
        {
            self.appDelegate.window?.rootViewController = entriesSplitView

        }, completion: nil)

}

このセカンダリ UISplitView のマスター ビュー コントローラーで、ナビゲーション コントローラーの leftBarButton を設定して、同様の関数をトリガーし、元の最上位レベルの UISplitView に戻します。

私の唯一の問題は、iPhone では、この遷移後に表示される最初のビューが詳細ビュー コントローラーであることを確認したいということですが、マスター ViewController を最初に表示してから、詳細を表示できるようにしたいということです。以下を追加することで解決できます。

       let masterNavigationController = entriesSplitView.viewControllers[0] as! UINavigationController
       masterNavigationController.popToRootViewControllerAnimated(false)

self.appDelegate.window?.rootViewController = entriesSplitViewですが、そうすると、ちらつきが速くなります。その呼び出しの前に置くと、望ましい効果がありません。

詳細ビューへのアクセスを許可しながら、マスタービューが最初に呼び出されたビューであることを確認する適切な方法に関するアイデアはありますか?

4

1 に答える 1

0

ここでは UISplitViewControllerDelegate があなたの友達だと思います。

ルート ビュー コントローラーを分割ビュー コントローラーのデリゲートにします。

self.splitViewController?.delegate = self

そして、次のメソッドを実装します。

extension MyViewController : UISplitViewControllerDelegate {
    func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {
        return true
    }
}

これにより、分割ビュー コントローラーは、水平コンパクト環境でデフォルトでマスターを表示するようになります。アプリに必要な効果を作成するには、関数の本体にカスタム ロジックが必要になる場合がありますが、ここで行う必要があります。

于 2016-03-24T14:09:35.623 に答える