Having a UINavigationController in the master view of a UISplitViewController in iOS 8

后端 未结 2 1234
情歌与酒
情歌与酒 2020-12-23 15:11

In my UISplitViewController, the master view is a UINavigationController containing a UITableViewController. Sometime, when the user s

2条回答
  •  天命终不由人
    2020-12-23 15:51

    Swift 4 Version with minor changes to make it work with my code:

    func splitViewController(_ splitViewController: UISplitViewController, showDetail vc: UIViewController, sender: Any?) -> Bool {
        if !isCollapsed {
            // in expanded mode set new VC as top view controller of the detail nav controller
            if let detailNavigationController = viewControllers[1] as? UINavigationController {
               detailNavigationController.setViewControllers([vc], animated: false)
            }
        } else {
            // in collapsed mode push the new view controller on the master nav controller
            if let masterNavigationController = viewControllers[0] as? UINavigationController {
                masterNavigationController.pushViewController(vc, animated: true)
            }
        }
        return true
    }
    
    func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {
    
        let masterNavigationController = primaryViewController as? UINavigationController
        let detailNavigationController = secondaryViewController as? UINavigationController
        let episodeDetailViewController = detailNavigationController?.viewControllers.first as? EpisodeDetailTableViewController
        if episodeDetailViewController?.episode == nil {
            // detail view is blank. We do not need to push this onto the master
            return true
        }
    
        guard var newMasterViewControllers = masterNavigationController?.viewControllers else { return false }
        newMasterViewControllers.append(contentsOf: detailNavigationController?.viewControllers ?? [])
        masterNavigationController?.setViewControllers(newMasterViewControllers, animated: false)
        return true
    }
    
    
    func splitViewController(_ splitViewController: UISplitViewController, separateSecondaryFrom primaryViewController: UIViewController) -> UIViewController? {
        let masterNavigationViewController = primaryViewController as? UINavigationController
    
        var newMasterViewControllers = [UIViewController]()
        var newDetailViewControllers = [UIViewController]()
    
        for vc in masterNavigationViewController?.viewControllers ?? [] {
            if vc is PodcastsTableViewController || vc is EpisodesTableViewController {
                newMasterViewControllers.append(vc)
            } else {
                newDetailViewControllers.append(vc)
            }
        }
    
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let detailNavigationController = storyboard.instantiateViewController(withIdentifier: "splitViewDetailViewController") as! UINavigationController
    
        if newDetailViewControllers.count == 0 {
            let emptyEpisodeDetailViewController = storyboard.instantiateViewController(withIdentifier: "episodeDetail")
            newDetailViewControllers.append(emptyEpisodeDetailViewController)
        }
    
        masterNavigationViewController?.setViewControllers(newMasterViewControllers, animated: false)
        detailNavigationController.setViewControllers(newDetailViewControllers, animated: false)
        return detailNavigationController
    }
    

提交回复
热议问题