带有 playground 的依赖框架
Dependent frameworks with playgrounds
假设我有 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.
我也一直在努力寻找最好的方法:(
我发现的最佳解决方案是创建一个 blank/empty 工作区,您可以在其中添加框架(只需将它们拖入工作区,就像添加到常规项目一样),然后还添加 playgrounds到工作区。
您无需打开 playground,而是打开工作区并在该上下文中使用 playground。
第一次在工作区打开playground会报错说找不到框架,但是运行build
后框架就可用了
另一个问题是,当您从此工作区访问框架时,还需要关闭使用该框架的任何其他项目。
如果您想查看示例设置,可以在此处查看我项目中的 'Playgrounds' 文件夹:https://github.com/mathewsanders/Mustard/tree/master/Playgrounds
很想知道其他人是否找到了比这更好的方法,因为在使用工作区时必须关闭其他项目的限制非常烦人。
终于明白了。问题是我的 "FancyLabels" 框架使用的是通过 Carthage (XCGLogger) 预构建的框架。解决方案是按照适当的步骤在 playground 中使用 Carthage 框架,即将框架的项目从 Carthage/Checkouts 添加到我的工作区并构建它。然后一切都按预期工作,甚至是框架项目内的游乐场,在 MyApp 框架的 storyboards/xibs.
中完全使用 FancyLabels
对于那些即使没有 Carthage 也难以设置这个问题的人,我在这里做了一个如何设置的快速工作示例:https://github.com/mfclarke/NestedFrameworksInPlaygrounds/
假设我有 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.
我也一直在努力寻找最好的方法:(
我发现的最佳解决方案是创建一个 blank/empty 工作区,您可以在其中添加框架(只需将它们拖入工作区,就像添加到常规项目一样),然后还添加 playgrounds到工作区。
您无需打开 playground,而是打开工作区并在该上下文中使用 playground。
第一次在工作区打开playground会报错说找不到框架,但是运行build
后框架就可用了
另一个问题是,当您从此工作区访问框架时,还需要关闭使用该框架的任何其他项目。
如果您想查看示例设置,可以在此处查看我项目中的 'Playgrounds' 文件夹:https://github.com/mathewsanders/Mustard/tree/master/Playgrounds
很想知道其他人是否找到了比这更好的方法,因为在使用工作区时必须关闭其他项目的限制非常烦人。
终于明白了。问题是我的 "FancyLabels" 框架使用的是通过 Carthage (XCGLogger) 预构建的框架。解决方案是按照适当的步骤在 playground 中使用 Carthage 框架,即将框架的项目从 Carthage/Checkouts 添加到我的工作区并构建它。然后一切都按预期工作,甚至是框架项目内的游乐场,在 MyApp 框架的 storyboards/xibs.
中完全使用 FancyLabels对于那些即使没有 Carthage 也难以设置这个问题的人,我在这里做了一个如何设置的快速工作示例:https://github.com/mfclarke/NestedFrameworksInPlaygrounds/