ios - UISplitView 的 MasterViewController 和导航问题

标签 ios swift uinavigationbar uisplitviewcontroller

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

我让它与 UITabBar 一起工作,但我的 masterViewController 出现问题,因为它生成了一个“重复”导航栏,覆盖了所有 masterViewController(选项卡)上的现有导航项,包括搜索选项卡上的 searchBar。

我的代码是:

应用委托(delegate)

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
}

在 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]
}

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

enter image description here

enter image description here

最佳答案

您解决了错误的 UINavigation Controller 的问题。我假设在拆分 master 和 SpeciesViewController 之前存在于相同的导航环境中,并使用相同的导航 Controller 。但在 Split View中他们没有。你的细节 Controller 实际上是你正在寻找的 UINavigation Controller ,它必须控制所有导航,并且必须有你需要的按钮。你可以从 master 那里得到它:

guard let split = splitViewController, let navController = split.viewControllers.last as? UINavigationController else { return }

并确保您拆分的 Controller 没有嵌入到另一个 UINavigationController 中(第二个导航栏的原因)。

编辑: 返回细节导航 Controller 的函数:

var detailsNavigationController: UINavigationController? {
    return splitViewController?.viewControllers.last as? UINavigationController
}

Storyboard Split 要访问蓝色调用 detailsNavController,要访问红色使用 navigationController。

关于ios - UISplitView 的 MasterViewController 和导航问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48026399/

相关文章:

swift - Firebase 规则 - 仅限于特定用户还是仅在获得授权的情况下?

ios - 如何在iOS8中删除UINavigationBar透明性?

ios - 如何立即隐藏单个 View Controller 上的导航栏?

ios - 将 iOS 平台添加到 ionic cordova 项目中的问题

ios - 查看 iOS 应用程序的设置 cookies?

swift - 如何使用 Swift 协议(protocol)函数作为 Android 接口(interface)监听器实现?

ios8 - 防止UISearchController在IOS8中隐藏view Navigation Bar

ios - Xcode 没有显示最新版本的 iOS?

ios - 检测 UIImage 中的颜色并保存 CGPoints

ios - 默认 UIFont 大小和粗细,但也支持 preferredFontForTextStyle