我和Nibs一起工作。我有两个屏幕,将使用"相同"具有相同行为的UIView
组件。它不是同一个组件,因为在每个屏幕中我放置了UIView
并进行了相同的配置,如图所示。
为了解决这个问题并防止在其他类中复制相同的代码,我编写了一个类,即UIView
子类,具有我需要的所有函数。
之后我将自定义类作为这些UIView
组件的超类来继承IBOutlets
和所有函数。
我的自定义类未在Nib
中定义,只是.swift
类。
我建立了所有必要的连接,但在运行时IBOutlets
为Nil
。
我的自定义类的代码:
class FeelingGuideView: UIView {
@IBOutlet weak var firstScreen: UILabel!
@IBOutlet weak var secondScreen: UILabel!
@IBOutlet weak var thirdScreen: UILabel!
@IBOutlet weak var fourthScreen: UILabel!
private var labelsToManage: [UILabel] = []
private var willShow: Int!
private var didShow: Int!
override init(frame: CGRect) {
super.init(frame: frame)
self.initLabelManagement()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.initLabelManagement()
}
private func initLabelManagement() {
self.initLabelVector()
self.willShow = 0
self.didShow = 0
self.setupLabelToShow(label: labelsToManage[0])
self.setupLabels()
}
private func initLabelVector() {
self.labelsToManage.append(self.firstScreen)
self.labelsToManage.append(self.secondScreen)
self.labelsToManage.append(self.thirdScreen)
self.labelsToManage.append(self.fourthScreen)
}
private func setupLabels() {
for label in labelsToManage {
label.layer.borderWidth = 2.0
label.layer.borderColor = UIColor(hex: "1A8BFB").cgColor
}
}
func willShowFeelCell(at index: Int) {
self.willShow = index
if willShow > didShow {
self.setupLabelToShow(label: labelsToManage[willShow])
}
else if willShow < didShow {
for i in didShow ... willShow + 1 {
let label = labelsToManage[i]
self.setupLabelToHide(label: label)
}
}
}
private func setupLabelToShow(label: UILabel) {
label.textColor = UIColor.white
label.backgroundColor = UIColor(hex: "1A8BFB")
}
private func setupLabelToHide(label: UILabel) {
label.textColor = UIColor(hex: "1A8BFB")
label.backgroundColor = UIColor.white
}
}
我发现这个问题与我的问题类似:Custom UIView from nib inside another UIViewController's nib - IBOutlets are nil
但我的UIView
不在笔尖中。
修改
我覆盖了awakeFromNib
,但它都没有进入方法。
更多解释
我的自定义类只是此组件的超类:
我在两个屏幕上复制。
一个屏幕是UITableViewCell
,另一个屏幕是UIViewController
。
根据UICollectionView
在initLabelVector()
调用required init?(coder aDecoder:)
函数时会产生解包错误:
尝试打开View
时的错误:
无法显示UITableViewCell
的错误,因为它是在应用开头调用的,并且不会显示任何内容。要在屏幕上显示错误,我需要删除UITableViewCell
的调用。
UITableViewCell
首先使用tableView.register(nib:)
注册,然后使用tableView.dequeueReusebleCell
。
从菜单类中调用UIViewController
:
startNavigation = UINavigationController(rootViewController: FellingScreenViewController())
appDelegate.centerContainer?.setCenterView(startNavigation, withCloseAnimation: true, completion: nil)
答案 0 :(得分:1)
当我的自定义类中的init()
被调用时,IBOutlets
尚未连接。
因此,我在父视图上创建了一个引用,并从iniLabelManagement()
方法调用了viewDidLoad()
,一切正常。
谢谢你,帮助和耐心!
答案 1 :(得分:0)
问题是这段代码:
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.initLabelManagement()
}
问题是init(coder:)
太快来谈论视图的出口,这是initLabelManagement
所做的事情;网点还没有连接起来。换句话说:
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func awakeFromNib() {
super.awakeFromNib()
self.initLabelManagement()
}
作为测试,我尝试了这个:
class MyView : UIView {
@IBOutlet var mySubview : UIView!
required init?(coder aDecoder: NSCoder) {
super.init(coder:aDecoder)
print(#function, self.mySubview)
}
override func awakeFromNib() {
super.awakeFromNib()
print(#function, self.mySubview)
}
}
这是输出:
init(coder:) nil
awakeFromNib() <UIView: 0x7fc17ef05b70 ... >
这证明了什么:
init(coder:)
太快;出口尚未连接
awakeFromNib
不太快;插座 连接
awakeFromNib
被称为,尽管您声称相反