xcode Interface Builder 未更新 IBDesignable 类

Posted

技术标签:

【中文标题】xcode Interface Builder 未更新 IBDesignable 类【英文标题】:xcode Interface Builder not updating IBDesignable class 【发布时间】:2017-11-24 10:54:05 【问题描述】:

在我的项目中,我有几个基于 UITextField 和 UIButton 的自定义类文件。

例如,UITextField 类如下所示:

import UIKit

@IBDesignable class RoundedTextField: UITextField 

    override func awakeFromNib() 
        super.awakeFromNib()

        layer.cornerRadius = 25
        layer.borderWidth = 2
        layer.borderColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
        clipsToBounds = true
        textColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)

        // Placeholder colour
        attributedPlaceholder = NSAttributedString(string: placeholder!, attributes: [NSAttributedStringKey.foregroundColor: #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)])
    

    // Placeholder text indent
    override func textRect(forBounds bounds: CGRect) -> CGRect 
        return bounds.insetBy(dx: 20, dy: 5)
    

    // Editing text indent
    override func editingRect(forBounds bounds: CGRect) -> CGRect 
        return bounds.insetBy(dx: 20, dy: 5)
    

这是模拟器显示给我的正确版本: SimScreenshot

这是 IB 向我展示的内容: IBScreenshot

从我的 IB 屏幕截图中可以看出,唯一更新的元素是占位符文本的缩进。该类的其余自定义项没有更新。

有什么想法吗?

附:当我选择一个元素时,在身份检查器中,“Designables”字段为“最新”。

我已经尝试清理、构建和重新启动 Xcode。

谢谢! 斯科特

【问题讨论】:

查看这个答案***.com/questions/45408409/…或这个***.com/questions/44533610/… 感谢 Reinier,我使用了您的第二个链接和另一个来源来解决问题。 【参考方案1】:

我在 Reinier 的第二个链接和我之前在 Udemy 上的一门课程的帮助下解决了这个问题。

我在 setupView() 函数中实现了我的自定义。我在prepareForInterfaceBuilder()awakeFromNib() 中调用了这个

import UIKit

@IBDesignable class RoundedTextField: UITextField 

    override func awakeFromNib() 
        super.awakeFromNib()
        setupView()
    

    override func prepareForInterfaceBuilder() 
        super.prepareForInterfaceBuilder()
        self.setupView()
    

    // Placeholder text indent
    override func textRect(forBounds bounds: CGRect) -> CGRect 
        return bounds.insetBy(dx: 20, dy: 5)
    

    // Editing text indent
    override func editingRect(forBounds bounds: CGRect) -> CGRect 
        return bounds.insetBy(dx: 20, dy: 5)
    

    func setupView() 
        layer.cornerRadius = 25
        layer.borderWidth = 2
        layer.borderColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
        clipsToBounds = true
        textColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)

        // Placeholder colour
        attributedPlaceholder = NSAttributedString(string: placeholder!, attributes: [NSAttributedStringKey.foregroundColor: #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)])
    

【讨论】:

【参考方案2】:

//它会同时更新 Simulator 和 InterfaceBuilder

import UIKit
@IBDesignable class ViewExtended: UIView 
    override func prepareForInterfaceBuilder() 
        super.prepareForInterfaceBuilder()
        setupView()
    
    func setupView() 
        layer.borderColor = borderColor.cgColor
        layer.borderWidth = borderWidth
        layer.cornerRadius = cornerRadius
        layer.shadowOpacity = shadowOpacity
        layer.shadowRadius = shadowRadius
    
    override func awakeFromNib() 
        super.awakeFromNib()
        setupView()
    
    @IBInspectable var borderColor: UIColor = UIColor.red 
        didSet 
            layer.borderColor = borderColor.cgColor
            setNeedsLayout()
        
    
    @IBInspectable var borderWidth: CGFloat = 1.0 
        didSet 
            layer.borderWidth = borderWidth
            setNeedsLayout()
        
    
    @IBInspectable var cornerRadius: CGFloat = 10.0 
        didSet 
            layer.cornerRadius = cornerRadius
            setNeedsLayout()
        
    
    @IBInspectable var shadowColor: UIColor = UIColor.black 
        didSet 
            layer.borderColor = borderColor.cgColor
            setNeedsLayout()
        
    
    @IBInspectable var shadowOpacity: Float = 0.7 
        didSet 
            layer.shadowOpacity = shadowOpacity
            setNeedsLayout()
        
    
    @IBInspectable var shadowRadius: CGFloat = 4.0 
        didSet 
            layer.shadowRadius = shadowRadius
            setNeedsLayout()
        
    
    @IBInspectable var shadowOffset: CGSize = CGSize(width: 3, height: 3) 
        didSet 
            layer.shadowOffset = shadowOffset
            setNeedsLayout()
        
    

【讨论】:

以上是关于xcode Interface Builder 未更新 IBDesignable 类的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 的 Interface Builder 中的外部对象占位符丢失

Interface Builder - 自定义类未显示

在 iOS8 的 Interface Builder 中向 UITableView 添加静态单元格?内容部分未显示

Xcode 和 Interface Builder 随机停止对话

Interface Builder文件中的Xcode 6未知类

Xcode 6 Interface Builder 视图大小错误