Зависимые рамки с игровыми площадками

Допустим, у меня есть 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

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

Другие вопросы по тегам