ios - UIPageViewController 并保存 UIViewController 的状态

标签 ios objective-c uipageviewcontroller

我对 UIPageViewControllers 还很陌生。我已经设置了一个可以通过不同类型的 UIViewControllers 进行分页的。

我注意到,当我滚动回上一个时,所有数据和状态都会重置(即我之前更改了 UIViewController 背景颜色,并且它已重置回默认值)。我正在使用 Storyboard中的恢复 ID 来启动这些 Controller 。

如果我使用这些,它不应该保存 Controller 的状态吗?

更改 Controller 的代码:

#pragma mark - UIPageViewControllerDataSource

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{

    //This is nice and avoids having to use a counter
    NSString *vcRestorationID = viewController.restorationIdentifier;
    NSUInteger index = [self.controllerRestorationIDs indexOfObject:vcRestorationID];

    if (index == 0) {
        return nil;
    }

    return [self viewControllerAtIndex:index - 1];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    NSString *vcRestorationID = viewController.restorationIdentifier;
    NSUInteger index = [self.controllerRestorationIDs indexOfObject:vcRestorationID];

    //Don't allow it to go forward if there is one at the end
    if (index == self.controllerRestorationIDs.count - 1) {
        return nil;
    }

    return [self viewControllerAtIndex:index + 1];
}


#pragma mark - Private Methods

- (UIViewController *)viewControllerAtIndex:(NSUInteger)index
{
    // Only process a valid index request.
    if (index >= self.controllerRestorationIDs.count) {
        return nil;
    }

    // Create a new view controller.
    BaseContentViewController *contentViewController = (BaseContentViewController *)[self.storyboard instantiateViewControllerWithIdentifier:self.controllerRestorationIDs[index]];

    // Set any data needed by the VC here
    contentViewController.rootViewController = self;

    return contentViewController;

}

有没有一种方法可以保存状态并且不会每次都重新加载 Controller ?

最佳答案

发生此行为是因为您每次访问它时都会实例化一个新的 View Controller 。

解决这个问题:

  • 您可以缓存 View Controller :将它们存储在页面 View Controller 的全局可变数组中,并在每次页面 View Controller 向其数据源询问 View Controller 时进行检查,将其添加到全局数组或在以下情况下检索它:它已经在那里了。
  • 对于在 View Controller 中更改的属性,使用类变量而不是实例变量。

第一个解决方案是 volatile 的:每当 pageVC 被释放时,您将丢失对 View Controller 所做的修改。第二个更确定。

关于ios - UIPageViewController 并保存 UIViewController 的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30461460/

相关文章:

ios - 如何在 iOS 中自动滚动页面 View Controller ?

iphone - RTL语言uipageviewcontroller动画

Objective-C 到 Swift : Facebook iOS API requestUserInfo method

ios - __destroy_helper_block_ 上的 Objective-C 崩溃

android - 是否可以创建一个应用程序,安装后用户可以通过双击主页按钮轻松打开和关闭蓝牙/NFC?

ios - 快速向右滑动时删除表格 View 灰色背景色

ios - 我应该使用什么来并行化 iOS 应用程序中对 REST 服务器的频繁 HTTP 请求 : GCD or NSThread?

iphone - 如何减少初始化 View Controller 的时间

IOS 14 - 自签名证书 - 不可信任

iPhone 模拟器 : App/Documents disappear