presentationIndexForPageViewController:返回值的文档说:
返回要在页面指示符中反映的所选项目的索引。
但是,这很模糊。当用户滚动浏览页面视图控制器时,它是否会调用此方法并期望正确的索引?
此外,无法保证何时 pageViewController:viewControllerBeforeViewController:和pageViewController:viewControllerAfterViewController:。文档提到:
[An]对象[提供]根据需要为页面视图控制器提供视图控制器,以响应导航手势。
事实上,我已经看到在某些情况下发生缓存。例如,如果您向前导航两个页面,它看起来只会被取消分配。否则,如果用户在页面视图控制器中向后移动,它希望将其保留在缓存中。
这是否意味着我需要通过注册为UIPageViewControllerDelegate
然后constantly updating this value来确定当前显示哪个页面的一致方式?
答案 0 :(得分:9)
关于 presentationCountForPageViewController:和 presentationIndexForPageViewController:,文档说明:
调用setViewControllers:direction:animated:completion:方法后调用这两个方法。在手势驱动导航之后,不会调用这些方法。索引会自动更新,预计视图控制器的数量将保持不变。
因此,看起来我们只需要在调用setViewControllers:direction:animated:completion:后立即返回有效值。
每当我实现数据源时,我都会创建一个帮助方法showViewControllerAtIndex:animated:
,并跟踪要在属性presentationPageIndex
中返回的值:
@property (nonatomic, assign) NSInteger presentationPageIndex;
@property (nonatomic, strong) NSArray *viewControllers; // customize this as needed
// ...
- (void)showViewControllerAtIndex:(NSUInteger)index animated:(BOOL)animated {
self.presentationPageIndex = index;
[self.pageViewController setViewControllers:@[self.viewControllers[index]] direction:UIPageViewControllerNavigationDirectionForward animated:animated completion:nil];
}
#pragma mark - UIPageViewControllerDataSource
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController {
return self.presentationPageIndex;
}
然后,您可以使用此方法显示正确的视图控制器,并使所选索引显示正确的值:
- (void)viewDidLoad {
[super viewDidLoad];
[self showViewControllerAtIndex:0 animated:NO];
}
- (IBAction)buttonTapped {
[self showViewControllerAtIndex:3 animated:YES];
}