从其他类调用更改时,UIView IBOutlet不变

问题描述

我有一个带有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/