【问题标题】:syncing UIPageViewController with UISegmentedControl logic issue将 UIPageViewController 与 UISegmentedControl 逻辑问题同步
【发布时间】:2015-12-27 16:49:49
【问题描述】:

我希望分段控件的作用类似于页面浏览控制器页面底部的灰点。因此,当我向右滑动时,它会移动到右侧的段,当我向左滑动时,它会移动到左侧的段。当我正确单击特定段时,我已经得到它来更改页面(因此,如果我单击第一个段,它会移动到第一页)。但是,我似乎无法让代码完全按照我的意愿去做。现在我有以下代码:

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers
{
    if([pendingViewControllers count]>0)
    {
        NSUInteger index =[(MasterTableViewController*)[pendingViewControllers objectAtIndex:0] pageIndex];
        segmentedControl.selectedSegmentIndex = index;
    }
}

这很好用,但问题是它是在转换发生时调用的,而不是在它完成时调用的。因此,当我开始更改页面但随后停止时,它会移动该段。所以,我尝试了一些其他代码:

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
    if(finished && completed && [previousViewControllers count]>0)
    {
        NSUInteger index =[(MasterTableViewController*)[previousViewControllers objectAtIndex:0] pageIndex];
        segmentedControl.selectedSegmentIndex = index;
        self.lastSelected = index;
    }
}

这是在正确的时间调用的。如果我放置一个 NSLOG,它会在我完成转换时显示,这正是我想要的,但由于某种原因,segmentcontrol 落后了 1 步。因此,如果我从第 1 页转到第 2 页,则段保持在 1,然后如果我从第 2 页转到第 3 页,则段移动到 2,然后从那时起,无论哪一个,它都继续落后一步我去的方向。我玩过它,我似乎无法弄清楚逻辑。非常感谢您的帮助!

这里是辅助函数:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    NSUInteger index = ((MasterTableViewController*) viewController).pageIndex;
    if ((index == 0) || (index == NSNotFound)) {
        return nil;
    }

    index--;
    return [self viewControllerAtIndex:index];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    NSUInteger index = ((MasterTableViewController*) viewController).pageIndex;

    if (index == NSNotFound) {
        return nil;
    }
    index++;
//    startingViewController.pageIndex = index;
    if (index == [self.pageTitles count]) {
        return nil;
    }
    return [self viewControllerAtIndex:index];
}

- (MasterTableViewController *)viewControllerAtIndex:(NSUInteger)index
{
    if (([self.pageTitles count] == 0) || (index >= [self.pageTitles count])) {
        return nil;
    }
    MasterTableViewController *pageContentViewController;

    if (index == 0)
    {
        pageContentViewController = [storyboard instantiateViewControllerWithIdentifier:@"OnCampusTable"];
    }
    else if (index == 1)
    {
        pageContentViewController = [storyboard instantiateViewControllerWithIdentifier:@"OffCampusTable"];
    }
    else if (index == 2)
    {
        pageContentViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyEventsTable"];
    }
//    pageContentViewController.titleText = self.pageTitles[index];
    pageContentViewController.pageIndex = index;

    return pageContentViewController;
}

任何被评论的东西都是我试图弄清逻辑的东西。我刚刚在运行 didFinishAnimating 的情况下运行了程序,并且 willTransitionToViewControllers 被注释掉了。这产生了滞后效应,其中分段控件位于单元格后面。非常感谢任何帮助

【问题讨论】:

    标签: ios iphone uisegmentedcontrol uipageviewcontroller


    【解决方案1】:

    我就是这样解决的:

    - (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers
    {
        if([pendingViewControllers count]>0)
        {
            NSUInteger index =[(MasterTableViewController*)[pendingViewControllers objectAtIndex:0] pageIndex];
            startingViewController.pageIndex = index;
        }
    }
    
    - (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
    {
        if(finished && completed && [previousViewControllers count]>0)
        {
            NSUInteger index =[(MasterTableViewController*)[previousViewControllers objectAtIndex:0] pageIndex];
            segmentedControl.selectedSegmentIndex = startingViewController.pageIndex;
            self.lastSelected = index;
        }
    }
    

    基本上,我同时使用了 willTransition 和 didFinishAnimation。当您调用转换时,该方法会更改全局变量 pageIndex 以获取页面索引,但不会更改段。当您完成动画时,didFinish 方法会拉取全局 pageIndex,并将段设置为该页面。

    【讨论】:

      【解决方案2】:

      你可以只使用 didset 方法:

      var pageIndex:Int!{
           didSet{
           segmentControl.selectedSegmentIndex = pageIndex
      }
      }
      

      【讨论】:

      • 这不起作用,因为 pageIndex 没有实时直观地更新。它会在您即将更改页面时更新,而不是在您实际更改页面时更新
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多