由于没有子视图,无法使用 Xib 文件创建自定义视图
Cannot create a custom view using Xib file due to nil subviews
我有一个包含 5 个子视图的 XIB 文件。 XIB 设置为自定义 class 像这样
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"
我收到错误
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
堆栈跟踪显示 XIB 已实例化,但子视图为零,因此无法设置。
这是因为你必须加载 nib 文件(这里我假设 nib 名称是 Slide)
let slide = Bundle.main.loadNibNamed("Slide", owner: nil, options: nil)![0] as! Slide
这样
let slide = Slide()
加载没有布局的视图,因此所有附加视图都是 nil
当你使用 Xibs 处理自定义视图时,你应该先加载它们。
因此,例如,在您的 Slide
class 中,您可以创建一个静态函数,例如:
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 设置正确的视图:
回顾一下您的视图应该如下所示(请注意,我将 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
}
}
我有一个包含 5 个子视图的 XIB 文件。 XIB 设置为自定义 class 像这样
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"
我收到错误
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
堆栈跟踪显示 XIB 已实例化,但子视图为零,因此无法设置。
这是因为你必须加载 nib 文件(这里我假设 nib 名称是 Slide)
let slide = Bundle.main.loadNibNamed("Slide", owner: nil, options: nil)![0] as! Slide
这样
let slide = Slide()
加载没有布局的视图,因此所有附加视图都是 nil
当你使用 Xibs 处理自定义视图时,你应该先加载它们。
因此,例如,在您的 Slide
class 中,您可以创建一个静态函数,例如:
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 设置正确的视图:
回顾一下您的视图应该如下所示(请注意,我将 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
}
}