Xcode 9:使用带有IBDesignable和IBInspectable的命名颜色会导致Interface Builder错误,但编译没有问题

Ful*_*lco 10 uicolor swift ibdesignable ibinspectable xcode9

UIColor.named("myColor")自Xcode 9问世以来,我在整个应用程序中使用.虽然我在UITextField一个IBDesignable类的自定义实现中有一个镜头,但我一直收到以下错误:

错误:IB Designables:无法呈现和更新ViewController()的自动布局状态:代理程序崩溃

此外,我的类有几个IBInspectable属性,包括类型UIColor,但在这些属性的Interface Builder下拉列表中,我只能选择标准颜色,我的命名颜色不会像标准类属性那样显示.

以后一个问题作为第一个问题的线索,不满意和临时的解决方案是在我的IBDesignable课堂上不使用命名颜色.或者,不使用IBDesignable.

这可能是一个错误,但我想知道其他人是否遇到过这个问题,如果有任何修复,他们会想出来.

jus*_*ela 7

[从 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)
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

每个UIView也有一个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
    }

}
Run Code Online (Sandbox Code Playgroud)

关于@IBInspectable在 Interface Builder中的属性中选择命名颜色,它只是半途而废。作为一种解决方法,您可以从“最近使用的颜色”部分中选择一种命名颜色,前提是您可以通过视觉将其从组中挑选出来。当您选择命名颜色时,它将正确显示名称,但(missing)无论出于何种原因都会附加。只需忽略(missing); 它将在 IB 和运行时正确显示。

另一点需要注意的是 Xcode(从 9.2 开始)可能会尝试再次将命名颜色添加到您的 Storyboard 文件中,因此您必须检查 XML 以查看颜色是否在那里多次定义(颜色定义接近底部)。或者,您可以继续使用,最终 Xcode 会注意到并自行修复它,将重复的颜色定义归咎于 SCM。