NSInternalInconsistencyException при загрузке файла пера из фреймворка - PullRequest
0 голосов
/ 06 марта 2020

Я создаю iOS фреймворк с именем TestFramework в swift на Xcode 11 и устанавливаю его Mach-O Type в static library в настройках целевой сборки.

Я добавляю xib-файл с именем MyViewController.xib с MyViewController.swift в проект фреймворка и создал класс MyViewController public.

Затем я создаю новый проект приложения iOS и добавляю TestFramework в проект в качестве фреймворка для встраивания.

Я использую следующий код для проверки инфраструктуры.

let bundle = Bundle(for: MyViewController.self)
print("bundle:", bundle)

let vc = MyViewController(nibName: "MyViewController", bundle: bundle)
print("ViewController:", vc)

Я получаю результат:

bundle: NSBundle </Users/xxx/TestApp.app> (loaded)
ViewController: <TestFramework.MyViewController: 0x7fce75403c40>

Кажется, все в порядке. Но когда я пытаюсь представить viewcontroller, это не удалось. Я получил NSInternalInconsistencyException.

self.present(vc, animated: false, completion: nil)

Деталь исключения:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/xxx/TestApp.app> (loaded)' with name 'MyViewController''

Любые идеи. Спасибо.

1 Ответ

1 голос
/ 06 марта 2020

Связывание инфраструктуры stati c будет встраивать код в инфраструктуру в вашем приложении, и все классы инфраструктуры будут, по сути, частью основного пакета, в отличие от динамических библиотек c.

Тем не менее, есть хороший способ использовать ресурсы из инфраструктуры c, и этого можно достичь, создав пакет ресурсов, который будет связан с инфраструктурой c, а затем загрузите ресурсы, указав к этому пакету.

  1. В своем проекте c Framework создайте новый пакет
  2. Измените базовый пакет SDK на Latest iOS или любую платформу, с которой вы будете sh поддержка на вкладке Build Settings пакета
  3. Из инспектора проекта добавьте пакет в качестве целевой зависимости в библиотеку stati c на вкладке Build Phases
  4. В своем тестовом приложении после связывания платформы stati c добавьте комплект ресурсов в список Copy Bundle Resources на вкладке Build Phases.

Это для настройки, теперь вы можете n используйте его в коде:

    guard let bundlePath = Bundle.main.path(forResource: "<your bundle name>" ofType: "bundle"),
          let bundle = Bundle(path: bundlePath) else { return }
    let viewController = MyViewController(nibName: "<your nib name>" bundle: bundle)

Этот код можно также использовать внутри структуры stati c, но вы должны всегда помнить, что пакет ресурсов всегда должен добавляться в Copy Bundle Resources каждого приложения, использующего эту платформу.

В случае динамических c библиотек / каркасов классы будут загружаться динамически из своего пакета, поэтому доступ к ресурсам более прост.

...