由于子视图无效,因此无法使用Xib文件创建自定义视图

时间:2018-08-28 20:57:38

标签: swift uiview xib

我有一个带有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 :(得分:0)

这是因为您必须加载笔尖文件(这里我想笔尖的名称是 Slide

export interface LoginResponse {
  result ? : {
    email ? : string;
    uid ? : string;
  }
  error ? : {
    code ? : string;
    message ? : string;
  }
}

如此

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

加载视图时不使用布局,因此所有附加视图均为let slide = Slide()

答案 1 :(得分: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
    }
}