UISplitView的MasterViewController和导航问题

Dav*_*ord 6 uinavigationbar uisplitviewcontroller ios swift

我正在更新我现有的应用程序以包含适用于iPad的SplitView.

我使用UITabBar,但是我的masterViewController有问题,因为它生成了一个"重复"导航栏,覆盖了所有masterViewControllers(选项卡)上的现有导航项,包括搜索选项卡上的searchBar.

我的代码是:

AppDelegate中

class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate {

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
{

    let splitViewController = self.window!.rootViewController as! UISplitViewController
    splitViewController.delegate = self
    splitViewController.preferredPrimaryColumnWidthFraction = 0.33
    splitViewController.minimumPrimaryColumnWidth = 375
    splitViewController.preferredDisplayMode = .allVisible

    return true
}

func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController:UIViewController, onto primaryViewController:UIViewController) -> Bool {
    return true
}
Run Code Online (Sandbox Code Playgroud)

在AppDelegate中有这个的原因是我看到了一个示例,其中放置它听到将允许我不要求每个不同的主视图(每个选项卡)中的代码.还没有测试这仍然在第一个主视图上工作.

主视图

override func viewDidLoad()

{

    self.extendedLayoutIncludesOpaqueBars = true

    self.navigationItem.hidesBackButton = true

    // 3D Touch
    if traitCollection.forceTouchCapability == .available {
        registerForPreviewing(with: self as UIViewControllerPreviewingDelegate, sourceView: view)
        ThreeDTouch = true
    }

    self.addSwitchVewButtonToNavigationBar()
    self.addCategoryButtonToNavigationBar()

}

func addSwitchVewButtonToNavigationBar() {
    let switchButton = UIButton(type: UIButtonType.custom)

    let editImage = UIImage(named: "CollectionButton")?.withRenderingMode(.alwaysTemplate)
    switchButton.setImage(editImage, for: .normal)
    switchButton.addTarget(self, action: #selector(SpeciesViewController.onSwitchView), for: UIControlEvents.touchUpInside)
    let switchButtonFinal = UIBarButtonItem(customView:switchButton)

    self.navigationItem.rightBarButtonItem = switchButtonFinal

}

@IBAction func onSwitchView(_ sender: UIBarButtonItem)
{
    AppDelegate.getAppState().isListViewSelected = false

    let speciesColletion = storyboard?.instantiateViewController(withIdentifier: Resource.SpeciesCollectionStoryboard) as! SpeciesCollectionViewController
    self.navigationController?.viewControllers = [speciesColletion]
}
Run Code Online (Sandbox Code Playgroud)

最初,onSwitchViewButton是使用IB嵌入的,但是没有用.这与详细信息视图上用于addFavorite的系统相同.

在此输入图像描述

在此输入图像描述

Mic*_*elV 4

您解决了错误的 UINavigation 控制器的问题。我假设在拆分之前 master 和 SpeciesViewController 都存在于相同的导航环境中,并使用相同的导航控制器。但在分屏视图中则不然。您的详细控制器实际上是您正在寻找的 UINavigation 控制器,它必须控制所有导航,并且必须具有您需要的按钮。您可以从 master 处获取它:

guard let split = splitViewController, let navController = split.viewControllers.last as? UINavigationController else { return }
Run Code Online (Sandbox Code Playgroud)

并确保您拆分的控制器未嵌入到另一个 UINavigationController 中(第二个导航栏的原因)。

编辑: 返回详细信息导航控制器的函数:

var detailsNavigationController: UINavigationController? {
    return splitViewController?.viewControllers.last as? UINavigationController
}
Run Code Online (Sandbox Code Playgroud)

故事板 分裂 要访问蓝色,请调用detailsNavController,要访问红色,请使用navigationController。