IBoutlet从SuperClass UIView连接仍然无

时间:2018-03-18 22:00:26

标签: ios swift xcode iboutlet

我和Nibs一起工作。我有两个屏幕,将使用"相同"具有相同行为的UIView组件。它不是同一个组件,因为在每个屏幕中我放置了UIView并进行了相同的配置,如图所示。

The two Screens

为了解决这个问题并防止在其他类中复制相同的代码,我编写了一个类,即UIView子类,具有我需要的所有函数。

之后我将自定义类作为这些UIView组件的超类来继承IBOutlets和所有函数。

Added as SuperClass of UIView Components

Custom superclass add success

我的自定义类未在Nib中定义,只是.swift类。

我建立了所有必要的连接,但在运行时IBOutletsNil

IBOutlets Connected

Connections on View

Connections on UITableViewCell

我的自定义类的代码:

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,但它都没有进入方法。

更多解释

我的自定义类只是此组件的超类:

Custom UIView

我在两个屏幕上复制。

一个屏幕是UITableViewCell,另一个屏幕是UIViewController

根据UICollectionView

上显示的屏幕管理标签行为的全部内容

initLabelVector()调用required init?(coder aDecoder:)函数时会产生解包错误:

Error

尝试打开View时的错误:

enter image description here

无法显示UITableViewCell的错误,因为它是在应用开头调用的,并且不会显示任何内容。要在屏幕上显示错误,我需要删除UITableViewCell的调用。

UITableViewCell首先使用tableView.register(nib:)注册,然后使用tableView.dequeueReusebleCell

从菜单类中调用UIViewController

startNavigation = UINavigationController(rootViewController: FellingScreenViewController())
appDelegate.centerContainer?.setCenterView(startNavigation, withCloseAnimation: true, completion: nil)

2 个答案:

答案 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 被称为,尽管您声称相反