awakeFromNib小总结

本文详细解释了awakeFromNib方法在使用IB时的用途,包括如何在创建ViewController时响应此方法,以及该方法在不同场景下的行为。通过实例演示了在XIB文件中定义子类并实现awakeFromNib方法的过程,最终展示了方法调用后的效果。

awakeFromNib

在使用IB的时候才会涉及到此方法的使用,当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的awakeFromNib函数来响应这个消息,执行一些必要的操作。

看例子:

创建一个viewController with XIB

定义一个UIView的子类



打开xib,并把View的类型指定为上一步骤定义的子类



然后在TestView.m中加入 awakeFromNib方法,运行程序发现此方法被调用了!!!可以在其中加代码来定义TestView的一些其他特性。

结果如图:



第一句:通过Xcode实例化controller,但controller的类在IB中创建时调用此方法

{我看有这么说的

awakeFromNib是一个只有在GUI对象被成功加载才调用的方法,而init方法是在GUI被创建前就已经调用了。

当程序对Nib文件进行反序列化然后初始化时,会调用一次awakeFromNib。 
但是如果你使用initWithNibName调入Nib时,awakeFromNib是不会被调用的。

这个好像不准确!!!

第二句:initWithcoder是系统自动调用的,以后说!!!

第三句和第四句:这两局setNeedsDisplay会异步的调用drawRect来更新view的内容,这个我可以理解,但为什么是两句有点不理解,请高手指教

第四句:这句就是awakeFromNib被调用的地方了。

第五句:上述都结束后,view处理好了后就调用viewDidLoad了,所以无论从代码还是从IB加载view都要调用viewDidLoad的。

报错:class DeviceListCell: UICollectionViewCell { @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var thumbnailImageView: UIImageView! @IBOutlet weak var statusLabel: UILabel! @IBOutlet weak var moreButton: UIButton! var onMoreTap: ((TPSSChannelInfo?) -> Void)? private var currentDevice: TPSSDeviceForDeviceList! private var selectedChannel: TPSSChannelInfo? override func awakeFromNib() { super.awakeFromNib() setupUI() } private func setupUI() { layer.cornerRadius = 8 clipsToBounds = true } func configure(with device: TPSSDeviceForDeviceList, channel: TPSSChannelInfo? = nil) { self.currentDevice = device self.selectedChannel = channel nameLabel.text = device.deviceName ?? "Unknown Device" statusLabel.text = (device.onlineStatus == .online) ? "在线" : "离线" statusLabel.textColor = (device.onlineStatus == .online) ? .systemGreen : .systemRed // 加载缩略图 if let url = device.snapshotUrl { thumbnailImageView.kf.setImage(with: url) } else { thumbnailImageView.image = UIImage(systemName: "camera") } // 清理旧事件 moreButton.removeTarget(nil, action: nil, for: .allEvents) moreButton.addTarget(self, action: #selector(moreButtonTapped), for: .touchUpInside) } @objc private func moreButtonTapped() { onMoreTap?(selectedChannel) } } Value of type 'TPSSDeviceForDeviceList' has no member 'deviceName' Cannot infer contextual base in reference to member 'online' Value of type 'TPSSDeviceForDeviceList' has no member 'onlineStatus' Value of type 'TPSSDeviceForDeviceList' has no member 'snapshotUrl' 'init(systemName:)' is only available in iOS 13.0 or newer
最新发布
12-06
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值