[截至 Xcode 9.2]这是一个不幸的解决方法,但现在我使用的是特定于 IB 的替代颜色。它并不完美,但我们至少可以在 Interface Builder 中进行设计时看到一些东西。
@IBDesignable
class MyView: UIView {
@IBInspectable
var addCoolSubview: Bool = false {
didSet {
if self.addCoolSubview {
let coolView = CoolView() // Some custom view with a `coolColor` property.
#if TARGET_INTERFACE_BUILDER
coolView.coolColor = UIColor.blue // An IB-only stand-in color.
#else
coolView.coolColor = UIColor(named: "myCoolBlue") // The run-time color we really want.
#endif
self.addSubview(coolView)
}
}
}
}
EveryUIView
也有一个prepareForInterfaceBuilder()
方法,它只在为 Interface Builder 构建时运行,可以被覆盖以达到类似的效果。
@IBDesignable
class MyOtherView: UIView {
var myWarmColor: UIColor? = UIColor(named: "myWarmColor") // Will be `nil` in IB.
// ... view does something with `myWarmColor` that would be visible in IB ...
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
// Set some IB-only stand-in colors here:
self.myWarmColor = UIColor.orange
}
}
关于@IBInspectable
在 Interface Builder 的属性中选择命名颜色,它只是半断。作为一种解决方法,您可以从“最近使用的颜色”部分中选择一种命名颜色,如果您可以通过视觉从组中选择它。当您选择命名颜色时,它将正确显示名称,但(missing)
无论出于何种原因附加。忽略(missing)
; 它将在 IB 和运行时正确显示。
另一点需要注意的是,Xcode(从 9.2 开始)可能会尝试将命名颜色再次添加到您的 Storyboard 文件中,因此您必须检查 XML 以查看颜色是否在那里定义了多次(颜色定义接近底部)。或者你可以直接滚动,最终 Xcode 会注意到并自行修复它,将重复的颜色定义归咎于 SCM。