如何让 PageViewController 显示不同的 ViewController
Posted
技术标签:
【中文标题】如何让 PageViewController 显示不同的 ViewController【英文标题】:How to get PageViewController to show different ViewController 【发布时间】:2014-11-21 21:54:17 【问题描述】:我正在尝试创建一个视图,该视图将基于另一个元素移动到某个 ViewController
,该元素返回它正在显示的对象的索引。
我能够显示特定的 ViewController 一次,但是当我从它返回时,无论屏幕上的哪个索引,我总是会得到相同的 ViewController
one。
这是我的代码:
在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
仍然只在第一次加载。同样,当我第一次转换到 SecondViewController
或 ThirdViewController
时,我会收到两次日志消息。
编辑: 刚刚注意到,我可以继续无限向下滚动,因为它会一次又一次地加载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 点的位置?
如何在 SwiftUI 中制作动态 PageViewController?
更新 ViewController 不更新 PageViewController 点