25

ナビゲーションコントローラーを使用したXCodeiPadプロジェクトがあります。UISplitViewControllerをナビゲーションスタックにプッシュするボタンを取得しようとしましたが、次のエラーが発生しました:

スプリットビューコントローラーをナビゲーションコントローラーにプッシュすることはできません

UISplitViewControllerはUINavigationControllerとうまく連携しないことが判明しました。ただし、このボタンをクリックしたときに分割ビューコントローラーを表示する必要があります。どうすればよいですか?また、重要なのは、ユーザーがナビゲーションコントローラーに戻ることができるように、戻るボタンを作成するにはどうすればよいですか?

4

4 に答える 4

32

SplitViewControllerを表示するには、setRootViewControllerを使用する必要があります。これは、SplitViewControllerがルートビューコントローラーである必要があるためです。

Appleのドキュメントから:

分割ビューコントローラは、作成するインターフェイスのルートである必要があります。つまり、UISplitViewControllerオブジェクトからのビューを、アプリケーションのウィンドウのルートビューとして常にインストールする必要があります。分割ビューインターフェイスのペインには、ナビゲーションコントローラ、タブバーコントローラ、またはインターフェイスを実装するために必要なその他のタイプのビューコントローラが含まれる場合があります。

戻るには、setRootViewControllerを使用して前のページに戻る必要があります。iPhoneアプリをユニバーサルに変換したときにこの問題が発生し、iPhone用のナビゲーションコントローラーとiPadバージョン用のsetRootViewControllerを使用することになりました。少し手間をかけずにうまくアニメートすることはできないので、少し残念です。

于 2012-04-05T00:57:46.097 に答える
3

それでも移動する必要がある場合の回避策の1つsplitViewは、空を作成して子としてUIViewController追加することです。splitViewController

/// This should be in your parent controller
/// that you to navigate your splitView
func navigateToSplit() {

    let container = UIViewController()
    let splitView = MySplitViewController() // ===> Your splitViewController
    container.addAsChildViewController(type: splitView, attached: container.view)
    navigationController?.pushViewController(container, animated: true)
}


extension UIViewController {
    /// this add a child controller to the view of another controller
    func addAsChildViewController(type controller: UIViewController, attached toView: UIView) {
        
        // Add Child View Controller
        addChild(controller)
        
        // Add Child View as Subview
        toView.addSubview(controller.view)
        
        // Configure Child View
        controller.view.frame = toView.bounds
        controller.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        
        // Notify Child View Controller
        controller.didMove(toParent: self)
        
    }
}


于 2020-06-29T10:27:31.077 に答える
2

ナビゲーションコントローラーを介してスプリットビューコントローラーをプッシュすることはできませんが、仕事を成し遂げる別の方法があります

ビューコントローラーを作成し、分割ビューコントローラーを子として追加してから、作成したビューコントローラーをナビゲーションコントローラーにプッシュできます。分割ビューコントローラが表示され、マスターと詳細の両方で作業できます。

*ストーリーボードのカスタムクラスにyoursplitviewcontrollerクラスを追加することを忘れないでください

スプリットコントローラーに注意->(マスター、詳細)

let splitVC = getViewController(storyBoardName: "story board name", viewControllerName: "split view controller identifier") as! yoursplitviewcontroller
        view.addSubview(splitVC.view)
        view.bounds = splitVC.view.bounds
        addChild(splitVC)

func getViewController(storyBoardName: String, viewControllerName: String) -> UIViewController{
        let storyBoard = UIStoryboard(name: storyBoardName, bundle: nil)
        return storyBoard.instantiateViewController(identifier: viewControllerName)
    }
于 2020-05-14T18:16:23.047 に答える
0

SplitViewを含む6番目のタブをアプリケーションに追加しました。iPadでは、新しいタブを選択すると正常に機能しましたが、iPhoneでは、新しいタブが[詳細...]タブに移動し、選択すると、「分割ビューコントローラーをナビゲーションコントローラー<UIMoreNavigationController:にプッシュできません」というメッセージが表示されました。

新しいタブを「その他…」タブに収まらないように移動して、問題を解決しました。

問題のより詳細な議論は以下で見つけることができます:

7つのタブを備えたタブバーコントローラー、5つのタブはスプリットビューコントローラーにつながります

于 2021-05-27T14:22:49.243 に答える