我正在处理一个我不了解的XCode错误,现在我已经在寻找解决方案好几天了,并且Pods更新,XCode重新启动或其他任何似乎都无法解决的问题...

我有一个从UIButton扩展的自定义类:

import Foundation
import UIKit

//@IBDesignable  <-- COMMENTED BUT SAME ERRORS ...
class CustomCardButton: UIButton {

    var nibName = "CustomCardButton"

    @IBOutlet weak var btnImageView: UIImageView!
    @IBOutlet weak var btnLabel: UILabel!

    @IBInspectable var image: UIImage? {
        get {
            return btnImageView.image
        } set(image) {
            btnImageView.image = image
        }
    }

    @IBInspectable var label: String? {
        get {
            return btnLabel.text
        } set(label) {
            btnLabel.text = label
        }
    }

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

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

    func setup() {
        let view = loadViewFromNib()
        view.frame = self.bounds
        view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
        btnImageView.layer.cornerRadius = 60/2
        btnImageView.layer.borderColor = UIColor(red: 5/255,
                                                 green: 66/255, blue: 38/255, alpha: 1).CGColor
        btnImageView.layer.borderWidth = 2
        btnLabel.font = UIFont.boldSystemFontOfSize(14.0)
        btnImageView.userInteractionEnabled = true
        btnLabel.userInteractionEnabled = true
        view.userInteractionEnabled = true
        addSubview(view)
    }

    func loadViewFromNib() -> UIButton {
        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: nibName, bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIButton
        return view
    }
}

这是来自SO的复制粘贴好的代码:Swift, Custom UIButton does not work when click

我的xib文件看起来像这样:

ios - 自定义UIButton引发多个设计错误-LMLPHP

我暂时将其保持简单,昨天我尝试使用更复杂的方法(是2标签和imageview Woooh,对于xcode来说是复杂的...),但我遇到了相同的错误..

错误是:

预编译:

ios - 自定义UIButton引发多个设计错误-LMLPHP

应用启动后,它崩溃了,我有这个:

30个let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIButton 线程1:EXC_BAD访问(代码= 2,地址= 0x16fc5bfd0)

31 let view = loadViewFromNib() 线程1:EXC_BAD访问(代码= 2,地址= 0x16fc5bfd0)

32 setup() 线程1:EXC_BAD访问(代码= 2,地址= 0x16fc5bfd0)

我从31到2840出现了这些错误...

我看到这是一个XCode错误,我们对此无能为力,但我确实需要一个带有2个标签和一个ImageVIew的“自定义”按钮...

最佳答案

您需要将UIView's类仅设置为UIView,而不是直接使用您的自定义类,在这种情况下,您的自定义类就是File's owner

您在加载时实例化此视图,因此如果自定义类将成为您的类,它将一遍又一遍地运行...

笔尖:
使用UIView作为子视图来制作UIButton(如果您的视图将是某个UIView,并且您将其更改为UIButton的类,则您的IBActions将无法工作,因此最好将UIButton作为子视图使用)

ios - 自定义UIButton引发多个设计错误-LMLPHP

您的File's owner是您的自定义类:
ios - 自定义UIButton引发多个设计错误-LMLPHP

现在您可以ctrl拖动IBOutletsFile's owner,只需ctrl将File's owner拖动到所需的视图:

ios - 自定义UIButton引发多个设计错误-LMLPHP ios - 自定义UIButton引发多个设计错误-LMLPHP

您可以对按钮使用IBActions进行相同操作

您的代码将有所更改:

如前所述,自定义类是UIView:

@IBDesignable class CustomCardButton: UIView

loadViewFromNib方法将返回UIView,而不是UIButton:
func loadViewFromNib() -> UIView {
    let bundle = NSBundle(forClass: self.dynamicType)
    let nib = UINib(nibName: nibName, bundle: bundle)
    let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
    return view
}

就是这样,您应该在storyBoard中看到IBDesignable:

ios - 自定义UIButton引发多个设计错误-LMLPHP

IBInspectables:

ios - 自定义UIButton引发多个设计错误-LMLPHP

关于ios - 自定义UIButton引发多个设计错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37456168/

10-10 23:25
查看更多