UIPageViewController与不同的ViewControllers,正确的方法?

基本上,我有一个表视图控制器和一个普通的视图控制器,我想这样,我可以在视图控制器之间滑动,如在应用程序的主屏幕(明显相同类型的视图控制器)。

但我发现的是,当您拥有相同类型的viewcontroller多个视图时,例如在图片之间滑动, UIpageviewcontroller是美国使用的,您可以在类中设置索引以及与索引和集相关的图像数组就这样。

但是我试图在这个设置中获得不同的视图控制器。 现在它是两个但肯定会达到4左右。

UIPageViewController是正确的设置方式还是其他方式。

编辑:下面添加的代码

  // // ViewController.m // testb // #import "MainPostController.h" #import "MainTableViewController.h" #import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize pageViewController; @synthesize indexValue = _indexValue; - (void)viewDidLoad { [super viewDidLoad]; self.indexValue= 1; NSLog(@"main intitated"); // Do any additional setup after loading the view, typically from a nib. self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"]; self.pageViewController.dataSource = self; MainTableViewController *tvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainTableViewController"]; MainPostController *pvc; NSArray *viewcontrollers =[NSArray arrayWithObjects:tvc, pvc, nil]; [self.pageViewController setViewControllers:viewcontrollers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 30); [self addChildViewController:pageViewController]; [self.view addSubview:pageViewController.view]; [self.pageViewController didMoveToParentViewController:self]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { if (self.indexValue == 1) { MainPostController *pvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainPostController"]; self.indexValue = 0 ; return pvc; } else return nil; } -(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { if (self.indexValue == 0) { MainTableViewController *tvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainTableViewController"]; self.indexValue = 1; return tvc; } else return nil; } @end 

我希望初始视图是表视图控制器(tvc),我希望Post视图控制器(pvc)在其左侧。 我可以加载它并轻松地在两者之间滑动,但有时我可以进一步滑动边界,所以基本上如果我开始在tvc – > pvc – > tvc然后我可以通过向右滑动到同一个tvc然后进一步到达边界或走另一条路tvc – > pvc – > tvc – > pvc – > pvc通过向左滑动进行最后一次转换。 最终达到了界限。 一旦应用程序在tvc初始启动我无法前进一个页面,(这应该发生什么)如果我去tvc – > pvc并尝试去左边的页面它不会让我(这是应该发生的事情) )

谢谢

最后完成它,没有必要为不同的类添加任何属性。 刚试过课。 inheritance人代码:

 -(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { if ([viewController isKindOfClass:[MainTableViewController class]]) { MainPostController *pvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainPostController"]; return pvc; } else return nil; } -(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { if ([viewController isKindOfClass:[MainPostController class]]) { MainTableViewController *tvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainTableViewController"]; return tvc; } else return nil; } 

应该很容易添加更多的视图控制器,因为我只需要添加if语句来测试它们。 解决方法的主要问题是方法isKindOfClass:

谢谢你的回复!

我有同样的问题,这就是我做的和完美的工作。

。H

 @interface ViewController : UIViewController  @property (strong, nonatomic) UIPageViewController *pageViewController; @property (nonatomic) NSArray *viewControllerIDArr; @end 

.M

 @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self setupDefaults]; } - (void)setupDefaults { self.viewControllerIDArr = @[@"FirstViewController", @"SecondViewController"]; self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"]; self.pageViewController.dataSource = self; UIViewController *startingViewController = [self.storyboard instantiateViewControllerWithIdentifier:self.viewControllerIDArr[0]]; NSArray *viewControllers = @[startingViewController]; [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 45); [self addChildViewController:_pageViewController]; [self.view addSubview:_pageViewController.view]; [self.pageViewController didMoveToParentViewController:self]; } - (UIViewController *)getViewControllerFromClass:(Class)class isNext:(BOOL)next { NSInteger index = [self.viewControllerIDArr indexOfObject:[NSString stringWithFormat:@"%@", class]]; if (next) index+=1; else index-=1; if (index < 0 || index >= self.viewControllerIDArr.count) return nil; else return [self.storyboard instantiateViewControllerWithIdentifier:self.viewControllerIDArr[index]]; } #pragma mark - Page View Controller Data Source - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { return [self getViewControllerFromClass:viewController.class isNext:NO]; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { return [self getViewControllerFromClass:viewController.class isNext:YES]; } - (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController { return 0; } - (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController { return 0; } 

注意:

self.viewControllerIDArr容器viewControllers的Storyboard ID

它在故事板中看起来像这样:

在此处输入图像描述

这是一个老问题但是由于我遇到了这个问题,我将发布我的解决方案。

我第一次这样做,我添加了我的代码

 func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { } 

当您使用两个手指连续滚动视图时会出现问题,并且除非滚动停止,否则不会调用didFinishAnimating

所以我只是使用了这个委托方法。

 func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [UIViewController]) { let currentView = pendingViewControllers[0] if currentView is UINavigationController && currentView.restorationIdentifier == "Settings" { index = 0 } else if currentView is UINavigationController && currentView.restorationIdentifier == "Main" { index = 1 } else if currentView is UINavigationController && currentView.restorationIdentifier == "Message" { index = 2 } } 

其中currentView是当前的UIViewController (或UINavigationController就像我正在使用的那样,使用restoreIdentifier来识别我的导航控制器),index是一个全局值,用于知道数组中的哪个UIViewController进行实例化。

您可以使用UIViewPageViewController和一些自定义逻辑。

正如您所说,处理此问题的常用方法是让页面视图控制器的数据源为每个页面创建相同类型的视图控制器,并使用模型中的数据填充它。

在您的情况下,您可以将pageNumber属性添加到您要在页面视图控制器中托管的所有视图控制器。 然后,在数据源方法中,使用旧视图控制器的页码来计算新的页码。 然后根据页码编写一个switch语句。 switch语句中的每个case都会创建一个不同类型的视图控制器。