【问题标题】:Changes on navigation bar in UIPageViewController not working properlyUIPageViewController 中导航栏的更改无法正常工作
【发布时间】:2019-12-12 20:22:25
【问题描述】:

我的代码:

@IBOutlet weak var pageControllerView: UIView!
@IBOutlet weak var pageController: UIPageControl!
// The pages it contains
var pages =  [UIViewController]()

// The UIPageViewController
var pageContainer: UIPageViewController!

viewDodLoad()

 // Setup the pages
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    page1 = storyboard.instantiateViewController(withIdentifier: "DVC") as? DashboardViewController1
    page2 = storyboard.instantiateViewController(withIdentifier: "MDVC") as? DashboardViewController2
    pages.append(page1)
    pages.append(page2)

    // Create the page container
    pageContainer = UIPageViewController(transitionStyle: .pageCurl, navigationOrientation: .horizontal, options: nil)
    pageContainer.delegate = self
    pageContainer.dataSource = self

    self.pageContainer.setViewControllers([self.page1], direction: UIPageViewController.NavigationDirection.forward, animated: false, completion: nil)

    DispatchQueue.main.async {
        self.firstLabel.text = "Dashboard1"
        self.filterBarButton.isEnabled = true
        self.filterBarButton.tintColor = .white
    }

    // Add it to the view
    pageControllerView.addSubview(pageContainer.view)

    // set the frame of the pageContainer view to match its superview (the pageControllerView view)
    pageContainer.view.frame =  pageControllerView.bounds
    // let it resize if needed (such as device rotation)
    pageContainer.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    // Configure our custom pageControl
    // view.bringSubviewToFront(pageController)
    pageController.numberOfPages = pages.count
    pageController.currentPage = 0



// MARK: - UIPageViewController delegates
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
    let currentIndex = pages.firstIndex(of:viewController)!
    print(currentIndex) //Prints 0
    if currentIndex == 0 {
        DispatchQueue.main.async {
            self.firstLabel.text = "Dashboard1"
            self.filterBarButton.isEnabled = true
            self.filterBarButton.tintColor = .white
        }
        return nil
    }
    let previousIndex = abs((currentIndex - 1) % pages.count)

    return pages[previousIndex]
}

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
    let currentIndex = pages.firstIndex(of:viewController)!
    print(currentIndex) //Print 1
    if currentIndex == 1 {
        DispatchQueue.main.async {
        self.firstLabel.text = "Dashboard2"
        self.filterBarButton.isEnabled = false
        self.filterBarButton.tintColor = .clear
        }
        return nil
    }
    let nextIndex = abs((currentIndex + 1) % pages.count)
    return pages[nextIndex]
}

func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
    pendingIndex = pages.firstIndex(of:pendingViewControllers.first!)
}

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    if completed {
        currentIndex = pendingIndex
        if let index = currentIndex {
            pageController.currentPage = index
        }
    }
}

这里我想在移动页面时更改导航标签标题和barButton状态。有时工作有时不工作。当我们在页面显示后再次向左或向右拖动页面时,它会发生变化。

【问题讨论】:

    标签: ios swift xcode cocoa-touch uipageviewcontroller


    【解决方案1】:

    实现:

    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        if completed {
            currentIndex = pendingIndex
            print(currentIndex)
            if currentIndex == 0 {
                DispatchQueue.main.async {
                    self.firstLabel.text = "Dashboard1"
                    self.filterBarButton.isEnabled = true
                    self.filterBarButton.tintColor = .white
                }
            }
            if currentIndex == 1 {
                DispatchQueue.main.async {
                    self.firstLabel.text = "Dashboard2"
                    self.filterBarButton.isEnabled = false
                    self.filterBarButton.tintColor = .clear
                }
            }
            if let index = currentIndex {
                pageController.currentPage = index
            }
        }
    }
    

    加载视图时不要更改导航栏

    【讨论】:

    • 不,您没有在正确的位置更新它,您应该将导航栏更改为委托功能
    • 我这样写可以吗
    • 我从 viewControllerBefore and viewControllerAfter 代表中删除了 if currentIndex == 1 { DispatchQueue.main.async { self.firstLabel.text = "Dashboard2" self.filterBarButton.isEnabled = false self.filterBarButton.tintColor = .clear } } 这段代码
    • 现在有了它,它应该可以工作了。对吗?
    • 是的,它工作正常,我从 viewControllerBefore and viewControllerAfter 删除了相同的代码