如何让 PageViewController 显示不同的 ViewController

Posted

技术标签:

【中文标题】如何让 PageViewController 显示不同的 ViewController【英文标题】:How to get PageViewController to show different ViewController 【发布时间】:2014-11-21 21:54:17 【问题描述】:

我正在尝试创建一个视图,该视图将基于另一个元素移动到某个 ViewController,该元素返回它正在显示的对象的索引。

我能够显示特定的 ViewController 一次,但是当我从它返回时,无论屏幕上的哪个索引,我总是会得到相同的 ViewControllerone。

这是我的代码:

ViewDidLoad 中,我设置了PageViewController 并将iCarousel 作为子视图添加到其中。

self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationVertical options:nil];

self.pageViewController.dataSource = self;
[[self.pageViewController view] setFrame:[[self view] bounds]];

_controller1 = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];
_controller2 = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstViewController"];
_controller3 = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];

self.viewControllers = [NSArray arrayWithObjects:_controller1, nil];

[self.pageViewController setViewControllers:self.viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];
[self.pageViewController didMoveToParentViewController:self];
[self.view addSubview:_carousel];

这里是控制当用户拉起视图时ViewController应该在屏幕上显示的代码。

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
    if (self.pageViewController.viewControllers[0] == self.controller2)
        return self.controller1;
    return nil;


- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
    if (self.pageViewController.viewControllers[0] == self.controller1) 
        if ([self.carousel currentItemIndex] == 2) 
            NSLog(@"Giving view %d", [self.carousel currentItemIndex]);

            return self.controller2;

         else if ([self.carousel currentItemIndex] == 3) 
            NSLog(@"Giving view %d", [self.carousel currentItemIndex]);

            return self.controller3;
        

    
    return nil;

我是否必须以某种方式销毁被拉取的ViewController,或者这甚至可以使用UIPageViewController

谢谢。

编辑: 当我要过渡到 ViewControllers 时,尝试实例化它们:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 

    if ([self.carousel currentItemIndex] == 2) 
        NSLog(@"load first vc %d", [self.carousel currentItemIndex]);
        FirstViewController *secondVC = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstViewController"];
        return secondVC;
     else if ([self.carousel currentItemIndex] == 3) 
        NSLog(@"load third vc 2 %d", [self.carousel currentItemIndex]);
        SecondViewController *thirdVC = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
        return thirdVC;
    
    return nil;

使用这种方法,我看到日志消息就像它工作正常,但正确的 View 仍然只在第一次加载。同样,当我第一次转换到 SecondViewControllerThirdViewController时,我会收到两次日志消息。

编辑: 刚刚注意到,我可以继续无限向下滚动,因为它会一次又一次地加载ViewController。因此,如果我将 iCarousel 滚动到索引 2 并拉起它的 View,我会首先获得上一个视图,但如果再次“拉动”,我会得到正确的视图。

我觉得我很亲近,但我错过了什么小东西?

最终编辑:

好吧,显然我的代码从一开始就是正确的。这里是someand some more关于UIPageViewControllerTransitionStyleScroll中的一个错误的讨论。因此,只需将转换更改为 curl 即可完成我想要做的事情。

如果有人能回答我将如何以及在何处实现 thisthe suggested answer,那就太好了。

【问题讨论】:

【参考方案1】:

将 UIPageView 更改为特定的方法是:

- (void)setViewControllers:(NSArray *)viewControllers direction:(UIPageViewControllerNavigationDirection)direction animated:(BOOL)animated completion:(void (^)(BOOL finished))completion;

要设置一个特定的viewController,你应该创建一个方法来封装该方法并在索引处获取一个viewController。为此,您应该将视图控制器放在一个数组中,以便您可以使用此方法引用它们。

-(void)setView:(NSUInteger)index     
    // create a view controller
    UIViewController *startingViewController = (UIViewController *)[self.arrayOfViewControllers objectAtIndex:index];
    // place it in an array
    NSArray *viewControllers = @[startingViewController];
    // Above method
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:nil];

【讨论】:

我有点失落。我将如何使用它?我是在 UIPageViewControllerDataSource 方法中还是在哪里使用该方法? 您可以在任何需要的地方使用 setViewControllers。

以上是关于如何让 PageViewController 显示不同的 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中更改 PageViewController 点的位置?

如何让 uipageviewcontroller 转圈

如何在 SwiftUI 中制作动态 PageViewController?

更新 ViewController 不更新 PageViewController 点

如何在 iOS 中将集合与 pageviewcontroller 一起使用

PageViewController 显示黑屏