当从不同的 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/