Внедрение контроллера представления из раскадровки с использованием тайфуна и Swift
Как правильно внедрить UIViewController, созданный из UIStoryboard, используя Typhoon и swift?
Я не могу найти каких-либо четких примеров этого ни в одном из примеров приложений, и когда я перевожу код Objective C из документации, возникает исключение.
Ниже приведен код из моей AppAssembly:
public dynamic func loginViewController() -> LoginViewController {
return TyphoonDefinition.withClass(LoginViewController.self) {
(definition) in
definition.injectProperty("socialClient",with:self.coreComponents.socialClient())
//definition.scope = TyphoonScope.Singleton
} as LoginViewController
}
И это исключение, которое выбрасывается:
0x10636ca1c: jne 0x10636ca10 ; swift_dynamicCastClassUnconditional + 48
0x10636ca1e: leaq 0x36b3d(%rip), %rax ; "Swift dynamic cast failed"
0x10636ca25: movq %rax, 0xb4a2c(%rip) ; gCRAnnotations + 8
0x10636ca2c: int3
0x10636ca2d: movq %rdi, %rax
0x10636ca30: popq %rbp
0x10636ca31: retq
0x10636ca32: nopw %cs:(%rax,%rax)
"Сбой динамического приведения Swift" приводит меня к мысли, что то, что было возможно при использовании Objective C, просто невозможно при использовании Swift.
Кто-нибудь смог сделать эту работу? Будем очень благодарны любой помощи. Библиотека выглядит очень красиво, и я очень хочу ее использовать.
2 ответа
Следующие правила применяются с использованием тайфуна в Swift и Objective-C:
- Во время сборки ваши интерфейсы сборки возвращают рецепты для сборки экземпляра объекта. Это включает в себя настройку вместе со всеми сотрудничающими компонентами.
- Во время выполнения интерфейс сборки возвращает компоненты, созданные в соответствии с этими рецептами.
Однако есть важное различие между Тайфуном Objective-C и Тайфуном Свифтом:
Objective-C:
- В Objective-C мы рекомендуем, чтобы ваши интерфейсы сборки объявляли возвращаемый тип, который будет построен, поскольку это обеспечивает лучшее завершение кода и позволяет избежать ненужного преобразования.
- В Objective-C вы можете иметь любой из ваших интерфейсов сборки "поза" перед
TyphoonComponentFactory
просто приведя его к одному из ваших интерфейсов сборки.
Swift:
- К сожалению, в Swift ваши методы сборки должны возвращать тип
AnyObject
, Строгая проверка типов Swift не позволит иначе. Это показано в кратком руководстве для Swift. - В Свифте невозможно разыграть
TyphoonComponentFactory
к одному из интерфейсов сборки. Однако все еще возможно ввести сборку в компонент следующим образом:
Внедрение сборки:
dynamic func appDelegate() -> AnyObject {
return TyphoonDefinition.withClass(AppDelegate.self) {
(definition) in
//The type of this property can be TyphoonComponentFactory or any of your
//assembly interfaces.
definition.injectProperty("assembly", with: self)
}
}
Исправление вашей аварии:
Поэтому, чтобы исправить ошибку, следуя приведенным выше условиям, измените код на следующий:
Измените свой код на следующее:
public dynamic func loginViewController() -> AnyObject {
//etc
}
Разрешение компонентов из раскадровки:
Пока ваш тайфун запускается используя интеграцию plist и включает обычный UILaunchStoryboardName
а также UIMainStoryboardFile
Тайфун будет гарантировать, что ваша раскадровка является экземпляром TyphoonStoryboard
это работает как обычная раскадровка с добавленным поведением, согласно которому зависимости вводятся в соответствии с правилами в вашей сборке.
Документация по этой функции находится здесь.
Следующие функции будут в ближайшее время:
- Образец Swift+Storyboard будет опубликован в ближайшее время. (Тем временем, дайте нам знать, если у вас все еще есть проблемы с работой.)
- Новый подход, который позволяет избежать ограничений в Swift, где
TyphoonComponentFactory
нельзя привести к интерфейсу сборки. (Начальная загрузка Typhoon через список приложений останется в силе).
Чтобы ответить на мой собственный вопрос и для всех остальных, кто сталкивался с той же проблемой, убедитесь, что ваш модуль установлен, и обратите особое внимание на журнал консоли, любые ошибки, которые могут содержать "неизвестный контроллер представления"
В вашей ApplicationAssembly не приводите контроллер представления к его строгому типу, оставьте его как AnyObject, как указано в документации.
Спасибо авторам Typhoon за написание такого потрясающего фреймворка!