Возможно ли восстановление состояния iOS в библиотеке iOS? - Не удалось найти раскадровку с именем - PullRequest
3 голосов
/ 06 апреля 2019

У меня есть библиотека с классами раскадровки и контроллера, которые реализуют сохранение состояния 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 корректно вызывает beforeSaveApplicationState в делегате и продолжает вызывать методы контроллера библиотеки encodeRestorableStateWithCoder.

Однако при попытке восстановления iOS корректно вызывает метод shouldRestoreApplicationState основного делегата приложения, но затем сразу же вылетает со следующим исключением:

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

Итак, iOS ищет раскадровку libraryMain в комплекте основного приложения. Как заставить iOS смотреть в комплекте библиотеки? Или просто невозможно реализовать восстановление состояния в библиотеке iOS?

Спасибо!

1 Ответ

1 голос
/ 15 апреля 2019

Если 'libraryMain' является статической библиотекой, которую вы связываете с основным приложением, то она не содержит файлов раскадровки, и в iOS отсутствует файл в основном комплекте (если вы специально не предоставили ее).

Причина в том, что статические библиотеки являются архивами скомпилированного кода, а ресурсы должны быть включены отдельно. В этом случае вам нужно найти способ связать свои ресурсы - либо включить раскадровку 'libraryMain' непосредственно в основное приложение, либо создать связку 'resource'.

Если 'libraryMain' - это фреймворк с файлом раскадровки внутри, то есть некоторые обходные пути.

Документация о сохранении состояния отмечает, что iOS проверяет два места для восстановления контроллера:

  1. viewControllerWithRestorationIdentifierPath: coder: класса восстановления (класс firstController, в вашем вопросе). Здесь вы можете создать и настроить экземпляр первого контроллера
  2. application: viewControllerWithRestorationIdentifierPath: coder: делегата приложения. Здесь вы можете создать экземпляр класса на основе пути восстановления.

Обе вышеприведенные опции выглядят как обходные пути, поскольку у меня нет реальной настройки вашего проекта для воспроизведения проблемы.

...