2017-02-07 3 views
0

Ниже приведено описание того, как я показываю разные виды, когда пользователь выполняет поиск, где self.viewControllerAtIndex() - это моя собственная пользовательская функция, которая возвращает представление. Проблема в том, что первые салфетки выходят «--------- салфетки справа до 0» дважды. И затем работает отлично, как ожидалось впоследствии.UIPageViewController initial swipe, вызываемый дважды

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 
    print("---------swipe Right before " + String(index)) 
    index += 1 
    print("---------swipe Right " + String(index)) 

    if index == (products!.count) { 
     index = 0 
    } 

    return self.viewControllerAtIndex(index:index) 

} 
=====CONSOLE OUTPUT===== 
---------swipe Right before 0 
---------swipe Right 1 
---------swipe Right before 0 
---------swipe Right 1 

func viewControllerAtIndex(index: Int) -> ViewController{ 

    return ViewController.init(id: index) 
} 

По какой-то причине, каждый другой салфетки после первых работ, как и следовало ожидать. Первоначальное салфетки - это то, что вызывает вывод консоли выше. Это вызывает у меня последовательность просмотра, чтобы выглядеть, как показано ниже (2 просмотров)

First Swipe 
View1 
Second Swipe 
View1 
Third Swipe 
View2 
Fourth Swipe 
View1 
Fifth Swipe 
View2 

Я также начала свою uiPageViewController как так

let array = [ViewController](repeating: ViewController.init(videos: (self.videos![self.products![self.index].id]!)), count: 1) 

self.UIViewPageController?.setViewControllers(array, direction: UIPageViewControllerNavigationDirection.forward, animated: false, completion: nil) 

Так я создаю новый ViewController на viewDidLoad, а затем, когда user swipes, я создаю новые ViewControllers

+0

См. Мой ответ здесь. http://stackoverflow.com/a/42032487/341994 – matt

ответ

0

Я думаю, вам следует избегать управления состоянием индекса в этом методе. Apple не гарантирует условия, при которых этот метод вызывается. Если бы мне пришлось перефразировать, я бы сказал, что в то время как структура запрашивает у вас контроллер просмотра, который должен появиться после предоставленного, вы отвечаете на другой вопрос: какой контроллер представлений приходит после того, о котором вы ранее говорили нам?

Чтобы обойти это, вам нужно использовать исходный массив контроллеров представлений, найти индекс контроллера пройденного доступа в этом массиве и вернуть контроллер вида, который будет следующим (или nil, если вы находитесь на конец массива).

Смежные вопросы