由于子视图为空,无法使用Xib文件创建自定义视图

3

我有一个包含5个子视图的XIB文件。将XIB设置为自定义类,如下所示:

class Slide: UIView {

    @IBOutlet weak var descriptionImage: UIImageView!
    @IBOutlet weak var descriptionLabel: UILabel!
    @IBOutlet weak var hiLabel: UILabel!
    @IBOutlet weak var loLabel: UILabel!
    @IBOutlet weak var humidityLabel: UILabel!

}

我这样实例化 let slide = Slide()

当我尝试设置变量,例如 slide.descriptionLabel = "Hello"

我会得到错误信息

线程 1: 意外地发现 nil 值,无法解包

堆栈跟踪显示 XIB 已被实例化,但子视图为 nil,因此无法设置。

2个回答

0
当您处理自定义视图并使用Xibs时,应首先加载它们。
例如,在您的Slide类中,您可以创建一个静态函数,如下所示:
static func createView(with owner: Any) -> Slide {
    let nib = UINib.init(nibName: "YourNibName", bundle: nil)
    let views = nib.instantiate(withOwner: owner, options: nil)
    let view = views[0] as! Slide
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
}

YourNibName 应该是你的 Xib 文件的名称。

这个静态函数可以像这样使用:

let slide = Slide.createView(with: self)

// attach the view to a superview
aSuperview.addSubview(slide)

// setup the right constraints
// for example
slide.topAnchor.constraint(equalTo: aSuperview.topAnchor).isActive = true
// ...and so on

重要的部分是在Interface Builder中为您的Xib设置正确的视图:

enter image description here

回顾一下,你的视图应该像这样(请注意,我将Slide重命名为SlideView。我觉得这样更好听):

class SlideView: UIView {
    @IBOutlet var descriptionImage: UIImageView!
    @IBOutlet var descriptionLabel: UILabel!
    @IBOutlet var hiLabel: UILabel!
    @IBOutlet var loLabel: UILabel!
    @IBOutlet var humidityLabel: UILabel!

    static func createView(with owner: Any) -> SlideView {
        let nib = UINib.init(nibName: "YourNibName", bundle: nil)
        let views = nib.instantiate(withOwner: owner, options: nil)
        let view = views[0] as! SlideView
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }
}

0

这是因为您需要加载 Nib 文件(我假设 Nib 名称为 Slide

let slide  = Bundle.main.loadNibNamed("Slide", owner: nil, options: nil)![0] as! Slide

像这样

let slide = Slide()

加载视图但不包含其布局,因此所有附加的视图都为nil


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