【问题标题】:Is there a way to keep the navigation bar across multiple views?有没有办法让导航栏跨多个视图?
【发布时间】:2018-10-22 17:43:30
【问题描述】:

所以我有 2 个视图,当我点击“转到第二个视图”时,导航栏应该是固定的,唯一应该移动的部分是导航栏下方的视图。 swift 是否有可能通过情节提要或以编程方式允许这样做?

【问题讨论】:

  • 在 NavigationController 中嵌入您的 ViewController。

标签: ios swift xcode navigationbar


【解决方案1】:

是的。有。

1。创建PageViewController.swift并粘贴下面的代码

//
//  Copyright © 2018 fewlinesofcode.com All rights reserved.
//
import UIKit

class PageViewController: UIPageViewController {
    fileprivate(set) var currentPageIndex: Int = 0
    
    var pages = [UIViewController]()
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        if let firstViewController = page(at: currentPageIndex) {
            setViewControllers([firstViewController], direction: .forward, animated: false, completion: { completed in })
        }
    }
    
    func resetIndex() { currentPageIndex = 0 }
    
    func page(at index: Int) -> UIViewController? {
        guard index >= 0 && index < pages.count else { return nil }
        return pages[index]
    }
}

extension PageViewController: UIPageViewControllerDataSource {
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        guard let pageIndex = pages.index(of: viewController), currentPageIndex != 0 else {
            return nil
        }
        currentPageIndex = pageIndex
        currentPageIndex -= 1
        return page(at: currentPageIndex)
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        guard let pageIndex = pages.index(of: viewController) else {
            return nil
        }
        currentPageIndex = pageIndex + 1
        
        if currentPageIndex == pages.count {
            return nil
        }
        return page(at: currentPageIndex)
    }
    
    func presentationCount(for pageViewController: UIPageViewController) -> Int {
        return pages.count
    }
    
    func presentationIndex(for pageViewController: UIPageViewController) -> Int {
        return currentPageIndex
    }
}

extension PageViewController {
    func showPrev(completion: ((Bool) -> Void)? = nil) {
        guard currentPageIndex > 0 else { return }
        currentPageIndex -= 1
        setViewControllers([pages[currentPageIndex]], direction: .reverse, animated: true, completion: completion)
    }
    
    func showNext(completion: ((Bool) -> Void)? = nil) {
        guard currentPageIndex < pages.count - 1 else { return }
        currentPageIndex += 1
        setViewControllers([pages[currentPageIndex]], direction: .forward, animated: true, completion: completion)
    }
}

2。像下面的示例一样对其进行子类化:

class ViewController: PageViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        setupChildViewControllers()
    }
    
    private func setupChildViewControllers() {
        let vc1 = <Instantiate your VC 1>
        let vc2 = <Instantiate your VC 2>
        
        pages = [
            vc1, vc2
        ]
    }
}

3。设置导航

只需将ViewController 嵌入UINavigationController

【讨论】:

  • 首先感谢您的回复,但它显示的是黑色视图。除了当我调试它时,变量'pages''是空的。所以我必须将 'setupChildViewControllers()' 移动到 'viewDidLoad()' 所以现在它正在调用该函数,但最后仍然显示黑色视图。
  • @Dimm91,请告诉我,你如何实例化你的视图控制器。
  • 对不起,这是我的错误,我没有覆盖我的第一个 ViewController 上的“viewDidLoad()”,现在我这样做了,它正在工作并显示视图,现在试图找出如何更改观点。谢谢!!
  • 好!因为我在没有测试的情况下编写ViewController 代码(我的错),所以可能会出错
  • 如果解决方案适合您,如果您再次将其标记为答案,我将不胜感激;)
【解决方案2】:

每个视图控制器都有自己的导航栏执行。唯一可行的方法是不要移动到另一个视图控制器,而是可以创建 UIView 的子类,并在单击该按钮时通过将其添加到基本视图控制器的子视图来呈现一个新的 UIView。

【讨论】:

    猜你喜欢
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多