【问题标题】:UIView IBOutlet not changing when change called from a different class当从不同的类调用更改时,UIView IBOutlet 不会更改
【发布时间】:2020-08-13 02:02:05
【问题描述】:

我有一个带有 UILabel 的 XIB。我已将 UILabel 引用到我创建的 UIView 类。我可以在初始化视图时使用label.text = "hi" 更改标签。当我尝试从另一个类调用更改时,它不会更改屏幕上的 UILabel(但如果我打印 label.text 它会显示为我设置的内容)。我无法在初始化时让 UILabel 加载文本,因为用户可以随时更改文本。 (switchText() 是从 UITableCell 调用的)

二等

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()
    }
    
    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 类中的 contentView。我的标签出口转到文件的所有者,然后转到声明为标签的 UIView 类。

【问题讨论】:

    标签: swift uiview uilabel


    【解决方案1】:

    您并没有真正更改 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/

    【讨论】:

    • 你能添加一个这样的例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多