UIPageViewController:返回当前可见视图

UIPageViewController:返回当前可见视图

你怎么知道里面显示的当前页面/视图是UIPageViewController什么?

我已经覆盖了viewDidAppear我的子视图的方法,因此他们在viewDidAppear方法中向父视图发送了一个id 。

但问题是:我无法可靠地将该id用作显示页面的id。因为如果用户转动页面但中途决定停止转动并将页面放回,viewDidAppear则已经被调用。(视图在卷曲页面后面可见)。

也许我应该只在当前视图消失的情况下切换到新的id。但我想知道是否有更简单的方法来返回当前可见的视图?


白板的微信
浏览 1124回答 3
3回答

繁星coding

您应该手动跟踪当前页面。委托方法pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:将告诉您何时更新该变量。该方法的最后一个参数transitionCompleted:可以告诉您用户是否完成了翻页过渡。

一只斗牛犬

从iOS 6开始,我发现viewControllersUIPageViewController 的属性不断更新,因此它将始终保存一个代表当前页面的视图控制器,而不是其他内容。因此,您可以通过调用viewControllers[0](假设您一次只显示一个视图控制器)来访问当前页面。只有在页面“锁定”到位时,viewController数组才会更新,因此如果用户决定部分显示下一页,则除非他们完成转换,否则它不会成为“当前”页面。如果要跟踪“页码”,请在通过UIPageViewController数据源方法创建视图控制器时为其分配索引值。例如:-(void)autoAdvance    {     UIViewController *currentVC = self.viewControllers[0];     NSUInteger currentIndex = [myViewControllers indexOfObject:currentVC];     if ( currentIndex >= (myViewControllers.count-1) ) return;     [self setViewControllers:@[myViewControllers[ currentIndex+1 ]]         direction:UIPageViewControllerNavigationDirectionForward         animated:YES         completion:nil];     }-(NSInteger)presentationIndexForPageViewController:                          (UIPageViewController *)pageViewController    {     // return 0;     UIViewController *currentVC = self.viewControllers[0];     NSUInteger currentIndex = [myViewControllers indexOfObject:currentVC];     return currentIndex;     }但请注意这是不可靠的评论。

守着一只汪

不幸的是,以上所有方法都没有帮助我。不过,我通过使用标签找到了解决方案。可能它不是最好的,但它有效,并希望它可以帮助某人:- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed  {     if (completed) {         int currentIndex = ((UIViewController *)self.pageViewController.viewControllers.firstObject).view.tag;         self.pageControl.currentPage = currentIndex;     }}在Swift :(感谢@Jessy)func pageViewController(pageViewController: UIPageViewController,     didFinishAnimating finished: Bool,     previousViewControllers: [UIViewController],     transitionCompleted completed: Bool){     guard completed else { return }     self.pageControl.currentPage = pageViewController.viewControllers!.first!.view.tag}示例: gist
打开App,查看更多内容
随时随地看视频慕课网APP