[英]UIImageView outlet nil in custom UIView with xib
我创建了一个具有多个IBOutlet的自定义UIView
,其中包括一个UIImageView和三个UILabel
。 尽管在awakeFromNib()函数中设置了图像值,但在尝试设置它时,我仍然会获得插座的零值。 UIView
是使用自定义xib文件构造的。
我将设置操作放在awakeFromNib()
,以确保在设置它们之前已初始化插座,但这无济于事。 我不确定xib文件是否有问题,因为我在制作自定义表格单元格时只使用过自定义xib,所以问题可能出在哪里?
class VotingCard: UIView {
@IBOutlet weak var proPicImg: UIImageView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var hometownLabel: UILabel!
@IBOutlet weak var ratingLabel: UILabel!
var proPic = UIImage()
var name = ""
var hometown = ""
var rating = 0.0
init(pic: UIImage, rush: Rush) {
proPic = pic
name = rush.fullName
hometown = rush.homeTown
rating = rush.compositeRating
super.init(frame: CGRect(x: 0, y: 0, width: 250, height: 300))
}
override func awakeFromNib() {
proPicImg.image = proPic
nameLabel.text = name
hometownLabel.text = hometown
ratingLabel.text = "\(rating)"
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
我应该查看一张带有个人资料图像和可见数据的简单卡片,但是它会崩溃。
编辑
基于NIB的开发已被弃用:
对于iOS开发人员,推荐使用情节提要来设计用户界面。
但是,看来您缺少此步骤:
在运行时,使用方法
loadNibNamed:owner:
或其变体加载nib文件。 文件的所有者是您通过nib文件作为该方法的所有者参数传递的对象的占位符。 当您在运行时加载文件时,无论您在Interface Builder的nib文件中与文件所有者之间建立或建立的任何连接都会重新建立。
参见示例:
https://medium.com/@umairhassanbaig/ios-swift-creating-a-custom-view-with-xib-ace878cd41c5
如果要使用Storyboard的推荐方式(显然不是,但这是针对一般观众的):
viewDidLoad()-创建视图控制器的内容视图(其视图层次结构的顶部)并从情节提要中加载时调用。 保证在调用此方法时,视图控制器的出口具有有效值。 使用此方法可以执行视图控制器所需的任何其他设置。
因此,使用UIViewController
方法,将您的代码放入viewDidLoad()
。
请记住,这总是被调用,因此这将覆盖自定义init()
函数的工作。 也许这就是您遇到的问题。
我将其重构以避免难看的代码。 始终创建Rush
对象(声明为Optional作为存储属性),但对于XIB情况,在aakeakeFromNib()中对其进行初始化,并在custom-init情况下复制输入对象。
然后, viewDidLoad()
没有条件。
你的问题是
1-imageView未连接到Ib,而修复方法是将其连接
要么
2-您使用init(pic: UIImage, rush: Rush) {
创建了一个视图对象,并且肯定不会用view加载UI,因此所有出口均为nil,并且添加了此方法的修复程序
class func getInstance(_ pic: UIImage, rush: Rush) -> VotingCard {
let v = Bundle.main.loadNibNamed("VotingCard", owner: self, options: nil)!.first as! VotingCard
v.proPic = pic
v.name = rush.fullName
v.hometown = rush.homeTown
v.rating = rush.compositeRating
return v
}
呼叫
let v = VotingCard.getInstance(<#image#>,rush:<#rush#>)
v.frame = // set some frame
// ready for use
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.