ios - 刷新一个 UIPageViewController

标签 ios objective-c uiviewcontroller uipageviewcontroller

我有一个 UIPageViewController (<UIPageViewControllerDataSource> 委托(delegate))管理 3 个 UIViewController .
要从第二个 View 转到第三个,我必须点击一个按钮,否则第二个 View 是最后一个可见页面。进入第 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 中的“动画错误”对我很有用)。然后第三个 View 是最后一个,我可以返回到第二个 View ,但是当我返回时没有 viewControllerAfterViewController:方法被调用,我仍然可以转到第三页。

相反,我想回到第二页,再次将第二页作为最后一页,每次返回时从缓存中删除第三页。
我已经在我的自定义 UIViewController 中尝试使用此代码第二页的类:
-(void)viewWillAppear:(BOOL)animated{
    [((UIPageViewController *)self.parentViewController) setViewControllers:@[myStaticViewController2] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
}

但它仅在我第二次尝试从该页面前后移动时才有效。再次调用 viewControllerAfterViewController 也没有用。里面viewControllerBeforeViewController就像我一样。
我希望我很清楚,我找不到解决这个问题的方法。

提前致谢

最佳答案

好的 - 我想我找到了一种让它工作的方法。

把它放在 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];
                } );
        } ];
}

在你的第二个 View Controller 中,我稍微修改了你在那里的内容:
- (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

关于ios - 刷新一个 UIPageViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20120995/

相关文章:

ios - AppDelegate 中的应用程序 didFinishLaunching 是否总是在打开应用程序更新后被调用?

ios - 如何以编程方式创建和填充嵌套的 UITableViewControllers?

objective-c - 在 iPhone 上使用 FFMPeg 解码 WMA

objective-c - 在 MonoTouch 中释放/处理 UIViewController

ios - 解除模态视图 Controller 时如何保持呈现 View Controller 的方向?

html - 从 UIWebView 在 Safari 中打开特定链接

ios - 如何获取请求中 header 的值(URLSession.shared.dataTask(带有 : request) { (data, 响应,错误)

objective-c - Objective C 中方法参数的 __block?

ios - 将 block 存储在实例变量中有什么用

ios - 检测来自另一个 VC 的警报是否可见