UIPageViewController показывает неправильную страницу после добавления третьей страницы

#swift #uipageviewcontroller

#быстрый #uipageviewконтроллер

Вопрос:

в моем проекте у меня есть UIPageViewController, который пользователь может добавлять к нему новые страницы (он начинается с одной страницы). каждый раз, когда пользователь добавляет новую страницу, UIPageViewController должен показывать текущую страницу (пользователь должен быть на последней странице, чтобы он мог добавить новую страницу). после добавления второй страницы все идет нормально, но когда пользователь находится на странице 2 и добавляет третью страницу и прокручивает вперед, UIPageViewController показывает первую страницу вместо отображения третьей страницы (по какой-то причине я не знаю, если пользователь прокручивает назад, все работает нормально, а UIPageViewController показывает страницу 1).

это мои коды для добавления новой страницы:

 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
        }
    }
}
 

Ответ №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)
    }
 

Вы добавляете новые ViewControllers в свой pageViewController, но не устанавливаете pageViewController на вновь созданный.

Надеюсь, это сработает для вас.

Комментарии:

1. Я создал демонстрационную версию для этого, и она работает нормально.

2. Вы уверены? Моя работа работает нормально при добавлении второй страницы, но после добавления третьей страницы и продвижения вперед проблема возникает. Нормально ли вы работаете в этой ситуации?

Ответ №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
    }
}
 

Комментарии:

1. Я получаю эту ошибку во время выполнения «Не знаю о сброшенном представлении»