12

UIColor.named("myColor")自从 Xcode 9 发布以来,我在整个应用程序中都使用它。在尝试UITextField作为一个IBDesignable类的自定义实现时,我不断收到以下错误:

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

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

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

这可能是一个错误,但我想知道那里的其他人是否遇到过这个问题,以及他们是否提出了任何修复。

4

1 回答 1

8

[截至 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。

于 2018-02-27T19:31:31.137 回答