【发布时间】:2017-01-04 08:30:28
【问题描述】:
当我在一个 Swift 框架中尝试调用在另一个 Swift 框架中定义为 UIView 扩展的函数时,我收到“无法识别的选择器发送到实例”错误。它看起来非常类似于通过将 -ObjC 标志传递给链接器 (https://developer.apple.com/library/ios/qa/qa1490/_index.html) 解决的问题以及在框架中扩展泛型时发生的问题 (Swift Framework does not include symbols from extensions to generic structs)。不幸的是,我的问题似乎有所不同,因为:
- 定义扩展的框架和定义扩展的框架 正在尝试使用它是用 Swift 编写的。
- 这两个框架都是“Cocoa Touch 框架”,而不是静态库。
- 被扩展的类是 UIView,不是泛型的。
- 将 -ObjC 或 -all_load 添加到所有 涉及的目标没有解决问题。
上下文是我已向 iOS 项目添加了一个框架目标来容纳 IBDesignable 类。主项目的名称是“Vital”,框架的名称是“VitalDesignables”。我添加了另一个名为“VitalKit”的框架来存放 Vital 和 VitalDesignables 都依赖的代码。 VitalKit 定义此函数以从 nib 加载视图,VitalDesignables 中的一个类尝试在 init(frame: CGRect) 中调用它,当我在情节提要中引用它时,IB 无法加载该类。
public extension UIView {
public func loadViewFromNib(nibName: String) -> UIView {
let bundle = NSBundle(forClass: self.dynamicType)
let nib = UINib(nibName: nibName, bundle: bundle)
let topLevelItems = nib.instantiateWithOwner(self, options: nil)
let topLevelViews = topLevelItems.filter() { $0.isKindOfClass(UIView) }
precondition(topLevelViews.count == 1,
"There must be only one top-level view")
return topLevelViews.first as! UIView
}
}
【问题讨论】:
-
从未尝试过,但如果你不能,那就太奇怪了。您必须将框架导入到您的框架中