我和鸟嘴一起工作。我有两个屏幕,它们将以相同的行为使用“相同”的UIView
组件。它不是同一组件,因为在每个屏幕上我都放置了一个UIView
并进行了相同的配置,如图所示。
为了解决这个问题并防止在其他类中复制相同的代码,我编写了一个类,即UIView
子类,其中包含我需要的所有功能。
之后,我将这些类UIView
组件的 super class 作为自定义类,以继承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
,但它均未输入方法。更多说明:
我的自定义类仅是此组件的 super class :
我在两个屏幕上复制。
一个屏幕是
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)
最佳答案
问题是此代码:
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
被调用,尽管您声称相反关于ios - 从SuperClass UIView连接的IBoutlet仍然无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49353255/