问题描述
我有一个带有UILabel的XIB。我已经将UILabel引用到我创建的UIView类。初始化视图时,我可以使用label.text = "hi"
更改标签。当我尝试从另一个类调用更改时,它不会更改屏幕上的UILabel(但是,如果我打印label.text
,它将显示为我设置的名称)。初始化时我无法使UILabel加载文本,因为用户可以随时更改文本。 (从UITableCell调用switchText())
二等班
class Second {
func switchText() {
let first = First()
dispatchQueue.main.async {
first.label.text = "bye"
}
}
}
一等班
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()
}
@R_404_3889@ 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与UIView类中的File's Owner
和contentView挂钩。我的标签出口进入文件的所有者,然后到达被声明为标签的UIView类。
解决方法
您并没有真正更改First()
类中的文本。您的switchText()
函数所做的是创建名为First的类的另一个引用,然后为该新引用设置标签的文本。
let first = First()
DispatchQueue.main.async {
first.label.text = "bye"
}
您可以做的是使switchText()
函数符合协议,然后通过委托在First()
类上调用它。
protocol SecondClassDelegate {
func didSwitchText(editedText: String)
}
class Second {
var delegate: SecondClassDelegate!
func switchText() {
delegate.didSwitchText("bye")
}
}
现在您可以将其添加到您的First()
类中
class First: SecondClassDelegate {
func didSwitchText(editedText: String) {
label.text = editedText
}
}
请不要忘记在设置Second()
类的任何地方设置委托
let second = Second()
second.delegate = self
我建议阅读此内容,以更好地理解代表。 https://www.appcoda.com/swift-delegate/