ios - 更改仍可在界面构建器/ Storyboard中覆盖的默认属性的默认值

标签 ios swift

假设我想创建一个标记为 IBDesignable 的自定义 ui 类,以便我可以在 Storyboard中使用它,是否可以覆盖默认属性的默认值但仍允许它在 Storyboard中被覆盖?

例如,如果我想创建一个自定义 UILabel,我可以将它的默认背景颜色覆盖为红色,这样每次我将它添加到 Storyboard 中的 View 时,默认情况下它都会有红色背景颜色(而不是默认的白色它通常有),但如果我将颜色更改为 Storyboard 中的任何其他颜色,它将保留该新颜色。

我知道我可以添加一个特定的 IBInspectable 属性作为 backgroundColor 的代理,但这不是最佳选择,因为这只会让我的对象上有 2 个属性来控制同一事物(backgroundColor)。

那么有人知道这样做的方法吗?

最佳答案

您可以使用外观代理来做到这一点。它专门设计用于为自定义子类提供自定义默认值。

必须在 Storyboard加载之前完成对外观代理的调用。一种方法是使用 initialize 类方法。

class MyCustomLabel: UILabel
{
    override class func initialize() {
        if (self === MyCustomLabel.self) {
            MyCustomLabel.appearance().backgroundColor = .red
        }
    }
}

并非所有属性都可以参与外观代理。那些可以在 Objective-C header 中用 UI_APPEARANCE_SELECTOR 宏标记的。显示类的 Objective-C header 的一种方法是在注释中按住命令并单击类名(这实际上可能是一个错误...)

// Copy this comment in you code an click on this: UIView

为了在界面生成器中呈现默认颜色,您可以使用 prepareForInterfaceBuilder 方法,如下所示:

override func prepareForInterfaceBuilder() {
    super.prepareForInterfaceBuilder()
    if (self.backgroundColor == nil) {
        self.backgroundColor = .red
    }
}

请注意,虽然它会正确渲染背景,但颜色下拉菜单仍会显示“默认”颜色。

关于ios - 更改仍可在界面构建器/ Storyboard中覆盖的默认属性的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44394437/

相关文章:

ios - React Native 与 Appsee 中的触摸手势问题

swift - 我如何添加 doneaction 并更改完成的文本?

ios - iOS 10 上的 ScrollView "bug",swift 4

iphone - 如果文本字段不为空,如何启用 UIButton?

ios - 为什么堆栈展开在 CFRunLoopRunSpecific 处停止

ios - 无法在自定义框架中添加 cocoapod 依赖项 - Swift

swift didSet 未在单例中调用

ios - 在 Swift 中设置 UITabBarController 的 View Controller

ios - Swift 项目链接器错误

objective-c - iOS 有没有默认的按钮样式