为了账号安全,请及时绑定邮箱和手机立即绑定

UIPageViewController:返回当前可见视图

UIPageViewController:返回当前可见视图

白板的微信 2019-08-27 17:51:58
UIPageViewController:返回当前可见视图你怎么知道里面显示的当前页面/视图是UIPageViewController什么?我已经覆盖了viewDidAppear我的子视图的方法,因此他们在viewDidAppear方法中向父视图发送了一个id 。但问题是:我无法可靠地将该id用作显示页面的id。因为如果用户转动页面但中途决定停止转动并将页面放回,viewDidAppear则已经被调用。(视图在卷曲页面后面可见)。也许我应该只在当前视图消失的情况下切换到新的id。但我想知道是否有更简单的方法来返回当前可见的视图?
查看完整描述

3 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

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

查看完整回答
反对 回复 2019-08-27
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

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

请注意这是不可靠的评论


查看完整回答
反对 回复 2019-08-27
?
守着一只汪

TA贡献1872条经验 获得超3个赞

不幸的是,以上所有方法都没有帮助我。不过,我通过使用标签找到了解决方案。可能它不是最好的,但它有效,并希望它可以帮助某人:

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


查看完整回答
反对 回复 2019-08-27
  • 3 回答
  • 0 关注
  • 1120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信