我和鸟嘴一起工作。我有两个屏幕,它们将以相同的行为使用“相同”的UIView组件。它不是同一组件,因为在每个屏幕上我都放置了一个UIView并进行了相同的配置,如图所示。

ios - 从SuperClass UIView连接的IBoutlet仍然无效-LMLPHP

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

之后,我将这些类UIView组件的 super class 作为自定义类,以继承IBOutlets和所有功能。

ios - 从SuperClass UIView连接的IBoutlet仍然无效-LMLPHP

ios - 从SuperClass UIView连接的IBoutlet仍然无效-LMLPHP

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

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

ios - 从SuperClass UIView连接的IBoutlet仍然无效-LMLPHP

ios - 从SuperClass UIView连接的IBoutlet仍然无效-LMLPHP

ios - 从SuperClass UIView连接的IBoutlet仍然无效-LMLPHP

我的自定义类的代码:

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 :

ios - 从SuperClass UIView连接的IBoutlet仍然无效-LMLPHP

我在两个屏幕上复制。

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

所有这些都将根据UICollectionView上当前显示的屏幕来管理标签的行为

当在initLabelVector()处调用required init?(coder aDecoder:)函数时,它会产生一个展开错误:

ios - 从SuperClass UIView连接的IBoutlet仍然无效-LMLPHP

尝试打开View时出现错误:

ios - 从SuperClass UIView连接的IBoutlet仍然无效-LMLPHP

无法使用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/

    10-14 20:48
    查看更多