将UIPageViewController与UISegmentedControl逻辑问题同步

时间:2014-02-04 19:54:55

标签: ios iphone uisegmentedcontrol uipageviewcontroller

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

- (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已经注释掉了。这给出了滞后效应,其中分段对照是细胞后面的一个。非常感谢任何帮助

2 个答案:

答案 0 :(得分:2)

这就是我解决它的方式:

- (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,并将该段设置为该页面。

答案 1 :(得分:0)

您可以使用didset方法:

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