【问题标题】:Is iOS state restoration possible in iOS library? -- Could not find a storyboard namediOS 库中是否可以恢复 iOS 状态? -- 找不到名为的情节提要
【发布时间】:2019-08-28 06:20:58
【问题描述】:

我有一个库,其中包含实现 iOS 状态保存的情节提要和控制器类。

要从主应用程序的委托启动库,我使用以下内容:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
    [self.window makeKeyAndVisible];
    self.window.rootViewController = myLibrary.sharedInstance.firstController;

    return YES;
}

然后在我的库中,firstController 是通过以下方式创建的:

- ( UIViewController * _Nullable ) firstController
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"libraryMain"
        bundle:[NSBundle bundleForClass:self.class]];

    return [storyboard instantiateViewControllerWithIdentifier:@"firstController"];
}

到目前为止一切顺利。它启动使用库的“libraryMain”情节提要的库的视图控制器。

在主应用的委托中,我还添加了 shouldSaveApplicationState 和 shouldRestoreApplicationState,它们都返回 YES。

当我的应用程序进入后台时,iOS 在委托中正确调用 shouldSaveApplicationState 并继续调用库控制器的 encodeRestorableStateWithCoder 方法。

但是,当它尝试恢复时,iOS 正确调用了主应用委托的 shouldRestoreApplicationState 方法,但随后立即崩溃并出现以下异常:

Exception occurred restoring state Could not find a storyboard named 'libraryMain' in bundle ... Main App.app

所以 iOS 正在主应用程序包中寻找 libraryMain 故事板。如何让 iOS 查看库的捆绑包?还是无法在 iOS 库中实现状态恢复?

谢谢!

【问题讨论】:

  • this 是您问题的解决方案吗?
  • 谢谢。但是,不确定如何使用它。我是否在 shouldRestoreApplicationState 方法期间将当前包更改为我的库?这看起来很 hacky,如果主应用程序也有需要恢复的故事板会发生什么?现在我正在寻找stackoverflow.com/questions/26077127/… 寻找可能的解决方案。
  • 使用 [NSBundle mainBundle] 而不是 [NSBundle bundleForClass:self.class]

标签: ios state-restoration ios-library


【解决方案1】:

如果“libraryMain”是您链接到主应用程序的静态库,则它不包含情节提要文件,并且 iOS 缺少主包中的文件(除非您特别提供)。

原因是静态库是编译代码的存档,资源必须单独包含。在这种情况下,您需要找到一种方法来捆绑您的资源 - 将“libraryMain”故事板直接包含到主应用程序中,或者创建一个“资源”捆绑包。

如果“libraryMain”是一个内部带有故事板文件的框架,那么有一些解决方法。

关于状态保存的documentation指出,iOS为了恢复控制器会检查两个地方:

  1. 恢复类的viewControllerWithRestorationIdentifierPath:coder:(在您的问题中为 firstController 类)。在这里您可以创建和配置第一个控制器的实例
  2. 应用程序委托的application:viewControllerWithRestorationIdentifierPath:coder:。在这里,您可以根据恢复路径创建类的实例。

上述两个选项看起来都是解决方法,因为我没有您的项目的实际设置来重现问题。

【讨论】:

  • 是的,我创建了一个带有故事板的框架,名为“libraryMain”。我会试试你的建议。 #2 似乎很有希望,因为我可以返回 firstController 对象。不确定它是否会起作用,因为 iOS 似乎忘记了框架的捆绑包。谢谢。
  • 是的。抱歉,还有什么办法?
  • 我在想这样的情况,如果没有嵌入框架,那么这将是找不到情节提要的原因,但事实并非如此。
  • 在实际阅读developer.apple.com/documentation/uikit/view_controllers/… 的文档后,第一张图清楚地表明,整个恢复过程发生在 application:didFinishLaunchingWithOptions: 在我调用框架的委托中调用之前第一次。我很确定解决方案就是这样,并希望在 application:willFinishLaunchingWithOptions: 中调用框架可能是我需要做的全部或至少一部分。今天试试..
  • 好吧,我将 application:didFinishLaunchingWithOptions 替换为 application:willFinishLaunchingWithOptions 以便在状态恢复开始之前创建库的视图控制器。它很好地启动了应用程序,但在恢复过程中我仍然遇到了同样的“找不到名为故事板”的问题。接下来我将看看“解决方法”。再次感谢您的帮助。
猜你喜欢
  • 2012-12-31
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多