我希望分段控件的行为类似于网页浏览控制器页面底部的灰点。因此,当我向右滑动时,它会移动到右侧的线段,当我向左滑动时,它会移动到左侧的线段。当我正确点击特定片段时,我已经让它改变了页面(所以如果我点击第一个片段,它会移动到第一页)。但是,我似乎无法使代码完全按照我的意愿去做。现在我有以下代码:
- (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已经注释掉了。这给出了滞后效应,其中分段对照是细胞后面的一个。非常感谢任何帮助
答案 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
}
}