gpt4 book ai didi

ios - Swift 初始化委托(delegate)

转载 作者:可可西里 更新时间:2023-11-01 02:19:34 25 4
gpt4 key购买 nike

对于来自 Java/C#/C++ 背景的 Swift 语言,我最困惑的事情之一是构造函数委托(delegate)。

我有read about it ,但我在现实生活中遇到了麻烦。

我正在制作一个自定义“DateView”来显示日期。

import UIKit

@IBDesignable class DateView: UIView {

private let _dateLabel = UILabel()

func initLabel() {
_dateLabel.frame = CGRectMake(0, 0, self.bounds.width, self.bounds.height)
addSubview(_dateLabel)
}

override init(frame: CGRect) {
super.init(frame: frame)
initLabel()
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initLabel()
}
}

我遇到的麻烦是如何正确初始化我的类。 override init 实际上是支持 IBDesignable 类所必需的。required init 是 UIView 的子类所必需的。是否有适当的方法来委托(delegate)初始化 _dateLabel 的公共(public)代码,同时利用 View 的边界来初始化标签?

另外,在你调用 super.init

can't call init before initializing label

您也不能在初始化_dateLabel 属性之前调用super.init;在我看来像是一个循环问题。

can't call self before init

我觉得将它委托(delegate)给一个单独的函数并不是解决这个问题的正确方法。

/pun 因为它是一个方便的初始值设定项,它确实不方便......:)

最佳答案

声明时不要初始化变量并删除 ?从初始化。

错误是因为当您访问初始化程序中的 dateLabel 时,它已经在初始化程序之外创建,因此它被访问/使用而不是初始化然后使用。

import UIKit

@IBDesignable class DateView: UIView {

private let _dateLabel = UILabel()

func initLabel() {
_dateLabel.frame = CGRectMake(0, 0, self.bounds.width, self.bounds.height)
addSubview(_dateLabel)
}

override init(frame: CGRect) {
super.init(frame: frame)
initLabel()
}

required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initLabel()
}
}

关于ios - Swift 初始化委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31798050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com