带有xib的自定义UIView中的UIImageView出口nil

时间:2019-01-09 21:02:14

标签: ios swift xcode uiview xib

我创建了一个自定义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)
    }
}

我应该查看一张带有个人资料图片和可见数据的简单卡片,但是它会崩溃。

2 个答案:

答案 0 :(得分:0)

编辑

基于NIB的开发已经过时了:

  

对于iOS开发人员,建议使用情节提要进行设计   用户界面。

https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/NibFile.html

但是,看来您缺少此步骤:

  

在运行时,您使用方法loadNibNamed:owner:加载nib文件   或其变体。文件的所有者是笔尖中的占位符   您作为对象的所有者参数传递的对象的文件   方法。无论您与文件之间建立的连接是什么   当您在Interface Builder中重新建立nib文件中的所有者   在运行时加载文件。

以示例为例:

https://medium.com/@umairhassanbaig/ios-swift-creating-a-custom-view-with-xib-ace878cd41c5

如果要使用Storyboard的推荐方式(显然不是,但这是针对一般观众的):

https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/WorkWithViewControllers.html

  

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