@IBDesignable在iOS Swift 3中无法工作

15

我做了什么: 删除派生数据,重新启动xcode,编辑器 -> 刷新所有视图

当我点击 编辑器->刷新所有视图 时,在故事板中出现 Designables 构建失败。

输入图像描述

请检查以下代码。 我漏掉了什么? 当我从属性检查器更改@IBInspectable值时,在故事板中文本字段没有更新。

import UIKit
import QuartzCore

@IBDesignable
class BorderedFloatingTF: UITextField {


    required init?(coder aDecoder:NSCoder) {
        super.init(coder:aDecoder)
        setup()
    }

    override init(frame:CGRect) {
        super.init(frame:frame)
        setup()
    }

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: 20, dy: 0)
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return textRect(forBounds: bounds)
    }
    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        setup()
    }

    // properties..

    @IBInspectable var enableTitle : Bool = false
    @IBInspectable var borderColor: UIColor = UIColor.white {
        didSet {
            layer.borderColor = borderColor.cgColor
        }
    }
    @IBInspectable var borderWidth: Int = 1 {
        didSet {
            layer.borderWidth = CGFloat(borderWidth)
        }
    }
    @IBInspectable var placeHolderColor: UIColor = UIColor.white {

        didSet {
            self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[NSForegroundColorAttributeName: placeHolderColor])
        }
    }

    fileprivate func setup() {
        borderStyle = UITextBorderStyle.none
        layer.borderWidth = CGFloat(borderWidth)
        layer.borderColor = borderColor.cgColor
        placeHolderColor = UIColor.white
    }
}

什么问题?我第一次这样做。 - abhimuralidharan
2
我已经完全测试了你的代码,它在我的系统中运行良好。这里我附上了与你的代码相关的快照。请重新启动你的Xcode并查看。可能是Xcode存在内存相关问题。 - Krunal
第一步是在Interface Builder崩溃日志中找到崩溃日志并检查堆栈跟踪。 - Sulthan
6个回答

7

我在一个项目中遇到了同样的问题。我按照以下步骤解决了这个问题。

在自定义的IBDesignable视图中,确保你覆盖了两种方法。

required init?(coder aDecoder: NSCoder)
override init(frame: CGRect)

在构建设置中的“运行路径搜索路径”中添加以下内容。
@loader_path/Frameworks
$(CONFIGURATION_BUILD_DIR)

清理您的项目,删除派生数据。

这应该都没问题了。


我的自定义控件在IB中从未被渲染,但是在添加了你提到的init方法后它开始工作了。我没有添加运行脚本。你是我的英雄,谢谢! - Jan Erik Schlorf

7

我曾经遇到一个自定义类从xib加载的问题。最终我偶然发现了这个解决方法(需要使用正确的bundle来加载类,而不是Bundle.main):

@IBDesignable
class DataEntryView: UIView {

@IBOutlet var contentView: DataEntryView!

@IBInspectable var hasError : Bool = false

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.commonInit()
}

override init(frame: CGRect) {
    super.init(frame: frame)
    self.commonInit()
}

private func commonInit() {
    let bundle = Bundle.init(for: type(of: self))
    bundle.loadNibNamed("DataEntryView", owner: self, options: nil)
    addSubview(contentView)
    contentView.translatesAutoresizingMaskIntoConstraints = false
    contentView.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
    contentView.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0).isActive = true
    contentView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 0).isActive = true
    contentView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0).isActive = true
}
}

你是救命恩人兄弟.. ‍♂️一直在尝试找出渲染时间过长的原因.. - Kautsya Kanu

7
请试一下这个:

![enter image description here


这是一个图片链接。
import QuartzCore

@IBDesignable
class BorderedFloatingTF: UITextField {


    required init?(coder aDecoder:NSCoder) {
        super.init(coder:aDecoder)
        setup()
    }

    override init(frame:CGRect) {
        super.init(frame:frame)
        setup()
    }

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: 20, dy: 0)
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return textRect(forBounds: bounds)
    }


    // properties..

    @IBInspectable var enableTitle : Bool = false
    @IBInspectable var borderColor: UIColor = UIColor.white {
        didSet {
            layer.borderColor = borderColor.cgColor
        }
    }
    @IBInspectable var borderWidth: Int = 1 {
        didSet {
            layer.borderWidth = CGFloat(borderWidth)
        }
    }
    @IBInspectable var placeHolderColor: UIColor = UIColor.white {

        didSet {
            self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[NSForegroundColorAttributeName: placeHolderColor])
        }
    }

    func setup() {
        borderStyle = UITextBorderStyle.none
        layer.borderWidth = CGFloat(borderWidth)
        layer.borderColor = borderColor.cgColor
        placeHolderColor = UIColor.white
    }
}

您的IBDesignablesIBInspectables都运行良好。


1
感谢您的努力,@krunal。我创建了一个新项目,这里的代码运行良好。 - abhimuralidharan

4
在我的项目中,我遗漏了设置其值类型的步骤。但是你的问题不在于此。但对于其他遇到和我一样问题的人,我想解释一下。
例如: 我之前写的类似以下内容:
@IBInspectable public var rowOrColoumnCount = 0

但实际应该是这样的:
@IBInspectable public var rowOrColoumnCount : Int = 0

0

检查“模块”字段中指定的模块是否正确。现在指定为“Template1”,是正确的吗? 同时尝试将所有@IBInspectable属性设置为公共属性。

请尝试仅保留此部分:

@IBDesignable
class BorderedFloatingTF: UITextField {

// properties..

@IBInspectable var enableTitle : Bool = false
@IBInspectable var borderColor: UIColor = UIColor.white {
    didSet {
        layer.borderColor = borderColor.cgColor
    }
}
@IBInspectable var borderWidth: Int = 1 {
    didSet {
        layer.borderWidth = CGFloat(borderWidth)
    }
}
@IBInspectable var placeHolderColor: UIColor = UIColor.white {

    didSet {
        self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[NSForegroundColorAttributeName: placeHolderColor])
    }
}

}


这并没有帮助。我仍然像问题中提到的那样无法构建成功。 - abhimuralidharan
请检查“模块”字段中指定的模块是否正确。现在指定为“Template1”,是否正确? 尝试将所有@ibinspectable属性设置为公共属性。 - Anton Novoselov

-1
  1. 将自定义类改回原来的样子(UITextField?)
  2. 在xib中仅将文件所有者设置为BorderedFloatingTF

我正在使用Storyboard。如果我没有设置自定义类,那么代码会怎样运行? - abhimuralidharan
我假设你在Storyboard中也有一个名为BorderedFloatingTF的对应xib文件。在这种情况下,你是在自身内部引用该类。当你在例如viewcontroller中使用你的BorderedFloatingTF时,你需要拖动一个普通的textField并将其类设置为你的自定义类。 - TheAppMentor
如果可以的话,你能分享一下你的项目吗?我无法想象这个项目的结构是什么样子的。 - TheAppMentor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接