Загрузка ресурса (например, раскадровки) в среде 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
в каркасе нет способа получить имя продукта?
- Рамки на самом деле не пучки (?), поэтому загрузка их в виде пакета может иметь непредвиденные последствия в будущем?
Могут возникнуть другие проблемы, решения вышеперечисленных проблем или вышеупомянутые проблемы, возможно, не являются проблемами в конце концов, но я не мог думать о них.
Этот вопрос может быть более подходящим для Обзор кода, но я чувствовал, что он тоже будет хорошо здесь. Если это нужно переместить туда, не стесняйтесь это делать или скажите мне, чтобы это сделать.
Ответы
Ответ 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)