IBOutlet 在 IBDesignable 类中为零

Posted

技术标签:

【中文标题】IBOutlet 在 IBDesignable 类中为零【英文标题】:IBOutlet is nil in IBDesignable class 【发布时间】:2018-10-30 17:58:27 【问题描述】:

我有一个应该只包含标签的自定义视图类。我在每个目标中都有一个扩展,它将提供应该在视图中显示的文本,这样我就不必重新创建每个控制器,只是为了在其中具有不同的标签和背景颜色。

我的自定义代码是:

@IBDesignable
class HomeAccentView: UIView 

    @IBOutlet weak var nameLabel: UILabel!

    override init(frame: CGRect) 
        super.init(frame: frame)

        setup()
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)

        setup()
    

    override func awakeFromNib() 
        super.awakeFromNib()

        setup()
    

    override func prepareForInterfaceBuilder() 
        super.prepareForInterfaceBuilder()

        setup()
    

    private func setup() 
        backgroundColor = UIColor.main

        nameLabel.text = String.headerText
        nameLabel.textColor = UIColor.white
    

我的 nib 文件所有者为 HomeAccentView,并且标签作为故事板上的插座连接。

但每当我尝试设置标签的文本时,它总是为零。我错过了什么或做错了什么?

【问题讨论】:

【参考方案1】:

您没有为视图设置类。您只设置了文件所有者,这意味着您告诉 HomeAccessView 负责加载视图,但您的代码没有显示这一点。这背后有什么动机吗?否则,从文件所有者中删除类并将其设置为查看。

【讨论】:

我不确定我是否完全理解您的要求。屏幕截图是包含将加载到我放入的控制器中的组件的笔尖。我的主情节提要上有一个控制器,它有一个视图,其类设置为HomeAccentView。这样就清楚了吗? 这不是 nib 的工作方式,如果您使用 nib 创建视图,则必须使用该 nib 文件加载它,您无法在不相关的视图控制器的视图中设置类并期望它使用笔尖的内容。 只是为了扩展 Emilios 评论,这是您想要实现的目标吗? medium.com/@ludovicjamet/… @Luzo 在一定程度上。您给出的示例只是一个没有子视图的按钮。至于改变背景颜色,我的班级已经在这样做了。 @CodyHarness ,你读对了吗?当然,它与您的代码不是 100% 匹配的。这是一个想法,你应该掌握。需要明确的是,您需要包装您的视图以便能够重用它,就像他们在示例中所做的那样并将其加载到包装器中。只需查找将自定义视图嵌入到情节提要中,就有大量关于它的文章。关于背景颜色,当然可以,你有一个空视图(因为你没有加载视图),即使它有背景颜色,也可以改变。

以上是关于IBOutlet 在 IBDesignable 类中为零的主要内容,如果未能解决你的问题,请参考以下文章

xcode Interface Builder 未更新 IBDesignable 类

无法将自定义 IBDesignable 类链接到情节提要上的 UIButton

Swift 无法从 @IBDesignable 类设置视图的高度

如何在 UIView 和 UIImageView 中重用相同的 IBDesignable 代码

层变换矩阵(CATransform3D 等)但带有 IBDesignable?

如何从 UIBezierPath 创建 IBDesignable 自定义 UIView?