UIPageViewController просмотры испортились, если пользователь движется слишком быстро - PullRequest
7 голосов
/ 20 марта 2012

У меня есть UIPageViewController, который использует целое число, чтобы указать, на какой странице он находится.Он работает нормально, но если пользователь несколько раз быстро проведет пальцем по странице, чтобы вернуться на страницу, целое число меняется быстрее, чем представления, а затем все рушится (приложение думает, что оно находится на странице 7, когда это может бытьотображение страницы 3).Что я делаю неправильно?Есть ли другой метод, который я должен использовать, чтобы сказать, где я?Спасибо.

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
    if (pageNumber == 0) {
        pageNumber++;
        NSLog(@"%i", pageNumber);
        Two *two = [[Two alloc] init];
        return two;
    } else if (pageNumber == 1) {
        pageNumber++;
        NSLog(@"%i", pageNumber);
        Three *three = [[Three alloc] init];
        return three;
    } else if (pageNumber >= 2) {
        return nil;
    } else {
        return nil;
    }
}

1 Ответ

9 голосов
/ 20 марта 2012

Проблема в том, что вы принимаете pageNumber как должное. UIPageViewController может только запросить следующую viewController для предварительной загрузки, и вы уже увеличиваете pageNumber.

Вы были близки, когда заметили, что «это также происходит, если пользователь захватывает край страницы и начинает его перемещать, но затем помещает и возвращает обратно на текущую страницу».

Этот метод получает UIViewController для параметра, и это единственная реальная ссылка , которая у вас есть.

Поскольку у вас есть только три страницы, один из способов решения этой проблемы:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    if ([viewController isKindOfClass: [One class]])
    {
        Two *two = [[Two alloc] init];
        return two;
    }
    else if ([viewController isKindOfClass: [Two class]])
    {
        Three *three = [[Three alloc] init];
        return three;
    }
    else
    {
        return nil;
    }
}

Примечание: этот код не лучшее решение - я просто пытаюсь указать, что вы не должны просто увеличивать / уменьшать pageNumber в viewControllerAfterViewController: / viewControllerBeforeViewController:

Вы могли бы также [[... alloc ]init] viewControllers до всего этого и уменьшить активность инициализации viewControllers в UIPageViewControllerDataSource методах до loadView (если он не загружен) максимум. Например (сокращенно):

    ...
    if ([viewController isKindOfClass: [One class]])
    {
        //Two *two = [[Two alloc] init]; //called before and two is someone's property
        if (![two isViewLoaded]) [two loadView];
        return two;
    }
    else if ...

Для большего количества страниц вы также можете попробовать пометить viewControllers (во время их инициализации). Поскольку UIViewController сам по себе не имеет свойства тега, вы, вероятно, можете использовать viewController.view.tag или sublcass UIViewController и добавить его к свойству pageNumber (это, вероятно, будет близко к THE решению.

...