Подтвердить что ты не робот

Загрузка ресурса (например, раскадровки) в среде Swift

Я пытаюсь создать структуру, которая будет связывать раскадровку. Я проверил, и созданный .framework включает мой файл .storyboard(как файл .storyboardc) и получил фреймворк для загрузки раскадровки во время выполнения. Тем не менее, это будет основой, я бы хотел, чтобы код был максимально универсальным, и я чувствую, что мое текущее решение немного взломано. В настоящее время я загружаю раскадровку, используя следующий код:

let mainBundlePath: String = NSBundle.mainBundle().resourcePath
let frameworkBundlePath = mainBundlePath.stringByAppendingPathComponent("Frameworks/AuthenticationManager.framework")
let frameworkBundle = NSBundle(path: frameworkBundlePath)
let storyboard = UIStoryboard(name: "Storyboard", bundle: frameworkBundle)

Несколько вещей, которые я заметил, могут быть исправлены:

  • Путь фреймворка (Frameworks/) может, возможно, измениться в будущем и не должен опираться?
  • Название фреймворка может измениться, но без предварительного получения NSBundle в каркасе нет способа получить имя продукта?
  • Рамки на самом деле не пучки (?), поэтому загрузка их в виде пакета может иметь непредвиденные последствия в будущем?

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

Этот вопрос может быть более подходящим для Обзор кода, но я чувствовал, что он тоже будет хорошо здесь. Если это нужно переместить туда, не стесняйтесь это делать или скажите мне, чтобы это сделать.

4b9b3361

Ответ 1

Здесь более чистое решение (без использования идентификаторов фреймов):

let storyboardName = "StoryboardName"
let storyboardBundle = NSBundle(forClass: self)
let storyboard = UIStoryboard(name: storyboardName, bundle: storyboardBundle)

Если этот код не находится внутри метода static, используйте YourClass.self вместо self.

Пример для Swift 3:

let storyboardBundle = Bundle(for: NumberPadViewController.self)
super.init(nibName: "NumberPadViewController", bundle: storyboardBundle)

Ответ 2

Структура (созданная из шаблона Cocoa Touch Framework ") имеет идентификатор пакета, который хранится в Info.plist сгенерированного пакета структуры.

Идентификатор пакета настраивается в общих целевых настройках. По умолчанию это <organization prefix>.<framework name>.

Вы можете найти фреймворк, используя этот идентификатор, например:

let frameworkBundle = NSBundle(identifier: "com.duffy.AuthenticationManager")
let storyboard = UIStoryboard(name: "Storyboard", bundle: frameworkBundle)

Ответ 3

Для Swift 3/4 теперь это просто Bundle:

let bundle = Bundle(identifier: "com.myframework.id")
let storyboard = UIStoryboard(name: "FrameworkMain", bundle: bundle)

Ответ 4

Это гораздо лучший способ загрузить пакет в Swift 3 без необходимости передавать строку, которая с большей вероятностью потерпит неудачу

let myBundle = Bundle(for: MyViewController.self)
let myStoryboard = UIStoryboard(name: "StoryboardName", bundle: myBundle)