当从不同的 class 调用更改时,UIView IBOutlet 不会更改
UIView IBOutlet not changing when change called from a different class
我有一个带有 UILabel 的 XIB。我已将 UILabel 引用到我创建的 UIView class。我可以在初始化视图时使用 label.text = "hi"
更改标签。当我尝试调用另一个 class 的更改时,它不会更改屏幕上的 UILabel(但如果我打印 label.text
,它会显示为我设置的内容)。我无法在初始化时让 UILabel 加载文本,因为用户可以随时更改文本。 (从 UITableCell 调用 switchText())
第二个class
class Second {
func switchText() {
let first = First()
DispatchQueue.main.async {
first.label.text = "bye"
}
}
}
第一class
class First: UIView {
let kCONTENT_XIB_NAME = "First"
@IBOutlet var label: UILabel!
@IBOutlet var contentView: UIView!
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
func commonInit() {
Bundle.main.loadNibNamed(kCONTENT_XIB_NAME, owner: self, options: nil)
contentView.fixInView(self)
}
override func awakeFromNib() {
super.awakeFromNib()
}
}
此外,在我的 XIB 中,我将 UIView 连接到 File's Owner
并在 UIView class 中连接了 contentView。我的标签出口转到文件所有者,然后转到 UIView class,它被声明为标签。
您并没有真正更改 First()
class 上的文字。您的 switchText()
函数所做的是创建另一个名为 First 的 class 引用,然后为该新引用设置标签文本。
let first = First()
DispatchQueue.main.async {
first.label.text = "bye"
}
您可以做的是使您的 switchText()
函数符合协议,然后通过委托在您的 First()
class 上调用它。
protocol SecondClassDelegate {
func didSwitchText(editedText: String)
}
class Second {
var delegate: SecondClassDelegate!
func switchText() {
delegate.didSwitchText("bye")
}
}
现在您可以将此添加到您的 First()
class
class First: SecondClassDelegate {
func didSwitchText(editedText: String) {
label.text = editedText
}
}
请不要忘记在设置 Second()
class
的任何地方设置委托
let second = Second()
second.delegate = self
我建议阅读此内容以更好地了解委托。 https://www.appcoda.com/swift-delegate/
我有一个带有 UILabel 的 XIB。我已将 UILabel 引用到我创建的 UIView class。我可以在初始化视图时使用 label.text = "hi"
更改标签。当我尝试调用另一个 class 的更改时,它不会更改屏幕上的 UILabel(但如果我打印 label.text
,它会显示为我设置的内容)。我无法在初始化时让 UILabel 加载文本,因为用户可以随时更改文本。 (从 UITableCell 调用 switchText())
第二个class
class Second {
func switchText() {
let first = First()
DispatchQueue.main.async {
first.label.text = "bye"
}
}
}
第一class
class First: UIView {
let kCONTENT_XIB_NAME = "First"
@IBOutlet var label: UILabel!
@IBOutlet var contentView: UIView!
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
func commonInit() {
Bundle.main.loadNibNamed(kCONTENT_XIB_NAME, owner: self, options: nil)
contentView.fixInView(self)
}
override func awakeFromNib() {
super.awakeFromNib()
}
}
此外,在我的 XIB 中,我将 UIView 连接到 File's Owner
并在 UIView class 中连接了 contentView。我的标签出口转到文件所有者,然后转到 UIView class,它被声明为标签。
您并没有真正更改 First()
class 上的文字。您的 switchText()
函数所做的是创建另一个名为 First 的 class 引用,然后为该新引用设置标签文本。
let first = First()
DispatchQueue.main.async {
first.label.text = "bye"
}
您可以做的是使您的 switchText()
函数符合协议,然后通过委托在您的 First()
class 上调用它。
protocol SecondClassDelegate {
func didSwitchText(editedText: String)
}
class Second {
var delegate: SecondClassDelegate!
func switchText() {
delegate.didSwitchText("bye")
}
}
现在您可以将此添加到您的 First()
class
class First: SecondClassDelegate {
func didSwitchText(editedText: String) {
label.text = editedText
}
}
请不要忘记在设置 Second()
class
let second = Second()
second.delegate = self
我建议阅读此内容以更好地了解委托。 https://www.appcoda.com/swift-delegate/