我创建了一个自定义UIView
,它具有多个IBOutlet,包括一个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)
}
}
我应该查看一张带有个人资料图片和可见数据的简单卡片,但是它会崩溃。
答案 0 :(得分:0)
编辑
基于NIB的开发已经过时了:
对于iOS开发人员,建议使用情节提要进行设计 用户界面。
但是,看来您缺少此步骤:
在运行时,您使用方法
loadNibNamed:owner:
加载nib文件 或其变体。文件的所有者是笔尖中的占位符 您作为对象的所有者参数传递的对象的文件 方法。无论您与文件之间建立的连接是什么 当您在Interface Builder中重新建立nib文件中的所有者 在运行时加载文件。
以示例为例:
https://medium.com/@umairhassanbaig/ios-swift-creating-a-custom-view-with-xib-ace878cd41c5
如果要使用Storyboard的推荐方式(显然不是,但这是针对一般观众的):
viewDidLoad()-在视图控制器的内容视图(顶部)中调用 的视图层次结构)是从情节提要中创建和加载的。的 View Controller的插座将确保具有有效值 调用此方法的时间。使用此方法执行其他任何操作 您的视图控制器需要进行设置。
因此,使用UIViewController
方法,将您的代码放在viewDidLoad()
中。
请记住,此调用总是 ,因此这将覆盖自定义init()
函数的工作。也许这就是您遇到的问题。
我将重构它以避免难看的代码。始终创建Rush
对象(声明为Optional作为存储属性),但对于XIB情况,请在aakeakeFromNib()中对其进行初始化,并在custom-init情况下复制输入对象。
然后viewDidLoad()
没有条件。
答案 1 :(得分:0)
您的问题是
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