【问题标题】:UIPageViewController show the wrong page after adding third pageUIPageViewController 添加第三页后显示错误的页面
【发布时间】:2021-03-19 08:46:17
【问题描述】:

在我的项目中,我有一个 UIPageViewController,用户可以向它添加新页面(它从一页开始)。每次用户添加新页面时,UIPageViewController 必须显示当前页面(用户必须在最后一页,以便他/她可以添加新页面)。添加第二页后一切正常,但是当用户在 page2 并添加第三页并向前滚动时,UIPageViewController 显示第一页而不是显示第三页(出于某种原因,我不知道,如果用户向后滚动一切正常和 UIPageViewController 显示 page1)。

这是我添加新页面的代码:

class HomePageVC: UIPageViewController {

    private var pages = [SomeVC]()
    private var currentSomeVC: SomeVC!

    override func viewDidLoad() {
        super.viewDidLoad()
    
        view.backgroundColor = .clear
    
        dataSource = self
        delegate = self
        
        let someVC = SomeVC()
        pages.append(someVC)

        if pages.count != 0 {
            currentSomeVC = pages[0]
            setViewControllers(pages, direction: .forward, animated: true, completion: nil)
        }
    
        if pages.count == 1 {
        
            delegate = nil
            dataSource = nil
        }
    }

    func addNewPage() {
        
        let someVC = SomeVC()
        pages.append(someVC)
        
        if delegate == nil, dataSource == nil {
            delegate = self
            dataSource = self
        }
    }
}

extension HomePageVC: UIPageViewControllerDelegate, UIPageViewControllerDataSource {

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        guard let viewControllerIndex = pages.firstIndex(of: viewController as! SomeVC) else {
            return nil
        }
    
            let previousIndex = viewControllerIndex - 1
    
        guard previousIndex >= 0 else {
            return pages.last
        }
    
        guard pages.count > previousIndex else {
            return nil
        }
    
        return pages[previousIndex]
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        guard let viewControllerIndex = pages.firstIndex(of: viewController as! SomeVC) else {
            return nil
        }
    
        let nextIndex = viewControllerIndex + 1
    
        guard pages.count != nextIndex else {
            return pages.first
        }
    
        guard pages.count > nextIndex else {
            return nil
        }
    
        return pages[nextIndex]
    }

    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    
        if completed {
        
            guard let viewControllerIndex = pages.firstIndex(of: pageViewController.viewControllers?.first as! SomeVC), let viewController = pageViewController.viewControllers?.first as? SomeVC else {
                return
            }
            currentSomeVC = viewController
        }
    }
}

【问题讨论】:

    标签: swift uipageviewcontroller


    【解决方案1】:

    尝试将您的 addNewPage() 方法替换为以下内容:

    func addNewPage() {
            
            let someVC = SomeVC()
            pages.append(someVC)
            
            if delegate == nil, dataSource == nil {
                delegate = self
                dataSource = self
            }
            setViewControllers([pages[pages.count-1]], direction: .forward, animated: true, completion: nil)
        }
    

    您正在向 pageViewController 添加新的 viewController,但没有将 pageViewController 设置为新创建的。

    希望它对你有用。

    【讨论】:

    • 我已经为此创建了演示,并且运行良好。
    • 你确定吗?添加第二页时我的工作正常,但在添加第三页并继续前进后,问题正在发生。你在这种情况下工作正常吗?
    【解决方案2】:

    重新加载 UIPageViewController,

    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        if !completed { return }
        DispatchQueue.main.async() {
            self.dataSource = nil
            self.dataSource = self
        }
    }
    

    【讨论】:

    • 我在运行时收到此错误“不知道刷新视图”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    相关资源
    最近更新 更多