当从不同的类调用更改时,UIView IBOutlet 不会更改

Posted

技术标签:

【中文标题】当从不同的类调用更改时,UIView IBOutlet 不会更改【英文标题】:UIView IBOutlet not changing when change called from a different class 【发布时间】: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 类。

【问题讨论】:

【参考方案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/

【讨论】:

你能添加一个这样的例子吗?

以上是关于当从不同的类调用更改时,UIView IBOutlet 不会更改的主要内容,如果未能解决你的问题,请参考以下文章

当从同一个组件调用时,两个 IBAction 触发的顺序是啥?

当从不同的计算机进行更改时,C# FileSystemWatcher 不会在 Nas 文件系统上触发

更改使用 loadNibNamed 实例化的类

更改 UIView 按钮操作

Xib 自定义 UIView 的实例化

当从一个子调用但另一个子调用时添加控件的子工作