【发布时间】:2018-03-18 22:00:25
【问题描述】:
我与 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 上当前显示的屏幕来管理标签的行为
当在required init?(coder aDecoder:) 处调用initLabelVector() 函数时,会出现解包错误:
尝试打开View时的错误:
UITableViewCell 无法显示错误,因为它在应用程序的开头被调用并且不显示任何内容。为了在屏幕上显示错误,我需要删除UITableViewCell 的调用。
UITableViewCell 首先使用tableView.register(nib:) 注册,然后使用tableView.dequeueReusebleCell。
UIViewController 是从菜单类中调用的:
startNavigation = UINavigationController(rootViewController: FellingScreenViewController())
appDelegate.centerContainer?.setCenterView(startNavigation, withCloseAnimation: true, completion: nil)
【问题讨论】:
-
也许
init(coder:)太早了:视图存在,但它的出口尚未连接。尝试在稍后初始化之前不要访问视图出口,例如覆盖willMove(toWindow:)或didMoveToWindow。此外,我认为您声称awakeFromNib没有被称为令人深感不安,因为那是我会尝试的初始化时刻。 -
非常感谢!这正是问题所在。在 init 中,出口尚未连接。我在
viewDidLoad()的父类上调用了initLabelManagement()函数并工作了。谢谢!