我正在更新现有应用,以包含适用于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
}
在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嵌入的,但是没有用。这与详细信息视图中用于addFavorite的系统相同。
答案 0 :(得分:4)
您解决错误的UINavigation控制器的问题。我假设在分割master和SpeciesViewController之前存在于相同的导航环境中,并使用相同的导航控制器。但在分裂视图中,他们并不是。您的细节控制器实际上是您正在寻找的UINavigation控制器,必须控制所有导航,并且必须具有您需要的按钮。你可以从master获得它:
guard let split = splitViewController, let navController = split.viewControllers.last as? UINavigationController else { return }
并确保将未嵌入的控制器拆分为另一个UINavigationController(第二个导航栏的原因)。
修改强> 返回详细信息导航控制器的功能:
var detailsNavigationController: UINavigationController? {
return splitViewController?.viewControllers.last as? UINavigationController
}