刷新一个 UIPageViewController
Posted
技术标签:
【中文标题】刷新一个 UIPageViewController【英文标题】:Refresh a UIPageViewController 【发布时间】:2013-11-21 12:26:49 【问题描述】:我有一个 UIPageViewController
(<UIPageViewControllerDataSource>
代表)管理 3 个 UIViewController
。
要从第二个视图转到第三个,我必须点击一个按钮,否则第二个视图是最后一个可见页面。进入第 3 页后,用户应该能够滑动以返回 2,但不能滑动以返回 3(始终需要该按钮才能返回第 3 页)。
这是代码的一部分:
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
UIViewController *prevViewController = nil;
if (viewController == self.P2ViewController)
prevViewController = self.P1ViewController;
if (viewController == self.P3ViewController)
[self pageViewController:pageViewController viewControllerAfterViewController:self.P2ViewController]; /*this doesn't work*/
prevViewController = self.P2ViewController;
return prevViewController;
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
UIViewController *nextViewController = nil;
if (viewController == self.P1ViewController)
nextViewController = self.P2ViewController;
if (viewController == self.P2ViewController)
nextViewController = nil;
return nextViewController;
然后我有一个自定义的UIViewController
类,其中我有一个 IBAction,并且我通过一个静态变量和一个通知传递了正确的 UIViewController。部分代码:
-(IBAction)goToPage:(NSNotification *)notification
/*some code*/
[((UIPageViewController *)self.parentViewController) setViewControllers:viewControllersArray direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];
我第一次从第 1 页转到第 2 页时,第二页是最后一页。然后我点击按钮,然后我正确地进入动画的第三页(UIPageViewController
中的“动画错误”对我很有用)。然后第三个视图是最后一个,我可以返回到第二个视图,但是当我返回时没有调用 viewControllerAfterViewController:
方法,我仍然可以转到第三页。
相反,我想返回第二页,将第二页作为最后一页,每次返回时从缓存中删除第三页。
我已经在第二页的自定义 UIViewController
类中尝试使用此代码:
-(void)viewWillAppear:(BOOL)animated
[((UIPageViewController *)self.parentViewController) setViewControllers:@[myStaticViewController2] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
但它仅在我第二次尝试从该页面前后移动时才有效。像我一样在viewControllerBeforeViewController
中再次调用viewControllerAfterViewController
也是没用的。
我希望我很清楚,我找不到这个问题的解决方案。
提前致谢
【问题讨论】:
创建一个小型演示项目并将其上传,这样人们就可以按照您的意愿尝试使其工作。 我创建了一个演示项目:This is the link。我希望这个主机能正常工作 【参考方案1】:好的 - 我想我找到了让它工作的方法。
把它放在PageViewController中,并在.h文件中添加一个声明:
// a button press is causing a move
- (void)moveToThirdController
__weak PageViewController *pc = self;
[self setViewControllers:@[self.P3ViewController] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL ret)
// second dispatch may be overkill
dispatch_async(dispatch_get_main_queue(), ^
// it seems setting no wipes the cache
[pc setViewControllers:@[pc.P3ViewController] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
);
];
在你的第二个视图控制器中,我稍微修改了你在那里的内容:
- (void)viewDidAppear:(BOOL)animated
[super viewDidAppear:animated];
__weak P2ViewController *pc = self;
dispatch_async(dispatch_get_main_queue(), ^
[((UIPageViewController *)self.parentViewController) setViewControllers:@[pc] direction:UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];
);
关键是不断尝试让 pageViewController 通过第二次调用来删除其缓存,其中动画为 NO。
事实证明这是首次发布的解决方案here的变体
【讨论】:
也许我不清楚:我不希望从 page2 向前滑动访问 page3,除非点击该页面上的按钮。然后,回到 page2,我希望 page3 从“UIPageViewController 缓存”中删除。 告诉你什么 - 你让问题更清楚,我会修改代码来做你想做的事。 非常感谢,对不起,我的英语很差。但是,一种解决方案可能是第三个UIViewController
page3 自定义类和viewDidDisappear
自定义setViewControllers:direction:animated:completion:
,但在这种情况下,它不适用于 3 页以上的应用程序(移动到第 4 页它会返回到第二个),我确实有很多页面。
谢谢!谢谢!我试图了解它是如何工作的。我看到 __weak
属性和 dispatch_async
prevent viewDidAppear
进入循环,这是我正在寻找的刷新!所以我试图删除-(void)moveToThirdController...
,因为我已经有一个IBAction
,事实上它确实有效。然而这是真的,这是一种类似于UIPageViewController
错误的情况。太好了,非常感谢!
良好的设计实践是将页面控制器的内部使用方式包含在该类中,并公开“驱动”它的方法。即使是在 viewController2 中完成的代码也应该是那里的一个方法。两年后,如果 UIPageController 发生变化,如果代码散布在所有类中,你将如何弄清楚你做了什么。无论如何我都会这样做,因为多年后我不得不查看我的旧代码并试图弄清楚我想要做什么......以上是关于刷新一个 UIPageViewController的主要内容,如果未能解决你的问题,请参考以下文章
uipageviewcontroller 中的 Swift uipageviewcontroller
UIPageViewController 和 UIScrollView
以编程方式平滑滚动 UIPageViewController
UIPageViewController - 到下一个视图控制器的动画过渡与方向变化混合