Зависимые рамки с игровыми площадками
Допустим, у меня есть 2 фреймворка:
- MyApp.framework
- FancyLabels.framework
MyApp.framework имеет раскадровку, в которой используются классы из FancyLabels.framework.
Если я создаю цель приложения, которая связывает и встраивает обе платформы, я могу создать экземпляр контроллеров представления из MyApp.framework без проблем.
Но если я попытаюсь создать экземпляр контроллера вида из MyApp.framework на игровой площадке, он не сможет найти классы из FancyLabels.framework.
Код моей детской площадки:
//: Playground - noun: a place where people can play
import UIKit
import MyApp
import FancyLabels
let bundle = Bundle(for: MyAppViewController.self)
let storyboard = UIStoryboard(name: "Main", bundle: bundle)
let vc = storyboard.instantiateViewController(withIdentifier: "MyAppViewController")
let view = vc.view
Вывод в консоль:
2017-01-22 19:18:17.016 MyPlayground[98260:3124481] Unknown class _TtC18FancyLabels11StyledLabel in Interface Builder file.
2017-01-22 19:18:17.037 MyPlayground[98260:3124481] Failed to set (styleString) user defined inspected property on (UILabel): [<UILabel 0x7fcf175017c0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key styleString.
2 ответа
Наконец-то понял это. Проблема заключалась в том, что мой фреймворк "FancyLabels" использовал готовый фреймворк через Carthage (XCGLogger). Решение состояло в том, чтобы выполнить соответствующие шаги для использования каркаса Карфагена на игровой площадке, а именно добавить проект каркаса из Карфагена / Checkouts в мое рабочее пространство и построить его. Тогда все работает, как ожидалось, даже площадка, которая находится внутри проекта фреймворка, с полным использованием FancyLabels в раскадровках / xibs фреймворка MyApp.
Для людей, приходящих на этот вопрос, которые испытывают трудности с настройкой этого даже без Карфагена, я сделал быстрый рабочий пример того, как настроить это здесь: https://github.com/mfclarke/NestedFrameworksInPlaygrounds/
Я изо всех сил пытался найти лучший подход для этого:(
Лучшее решение, которое я нашел, - это создать пустое / пустое рабочее пространство, в которое вы можете добавить свой каркас (просто перетащите их в рабочее пространство, как если бы вы добавляли в обычный проект), а затем также добавить игровые площадки в рабочее пространство.
Вместо того, чтобы открывать игровые площадки, вы открываете рабочее пространство и используете игровую площадку в этом контексте.
При первом открытии игровой площадки в рабочей области вы получите сообщение о том, что каркас не найден, но после запуска build
рамки доступны.
Другой недостаток заключается в том, что при доступе к фреймворку из этого рабочего пространства любые другие проекты, использующие фреймворк, также должны быть закрыты.
Если вы хотите проверить пример установки, вы можете увидеть папку "Playgrounds" в моем проекте здесь: https://github.com/mathewsanders/Mustard/tree/master/Playgrounds
Хотелось бы услышать, если бы другие люди нашли лучший подход, чем это, потому что ограничение необходимости закрывать другие проекты при использовании рабочей области довольно раздражает.