繁体   English   中英

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

[英]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开发人员,推荐使用情节提要来设计用户界面。

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

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

在运行时,使用方法loadNibNamed:owner:或其变体加载nib文件。 文件的所有者是您通过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()-创建视图控制器的内容视图(其视图层次结构的顶部)并从情节提要中加载时调用。 保证在调用此方法时,视图控制器的出口具有有效值。 使用此方法可以执行视图控制器所需的任何其他设置。

因此,使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM