在Swift中更改变量值时执行方法

伊利尔诉格鲁达

当变量值更改时,我需要执行一个函数。

我有一个单例类,其中包含一个名为的共享变量labelChange该变量的值来自另一个名为的类Model我有两个VC类,其中一个具有按钮和标签,第二个只有按钮。

当按下第一个VC类中的按钮时,我正在使用此func更新标签:

func updateLabel(){
    self.label.text = SharingManager.sharedInstance.labelChange
}

但是,无论何时labelChange更改的值,我都想调用相同的方法因此,在按钮单击中,我将仅更新labelChange值,并且在发生这种情况时,我想使用的新值来更新标签labelChange同样,在第二个VC中,我可以更新该labelChange值,但是当该值更改时,我无法更新标签。

也许属性是解决方案,但是任何人都可以向我展示如何做到这一点。

第二次编辑:

单例课程:

class SharingManager {
    func updateLabel() {
        println(labelChange)
        ViewController().label.text = SharingManager.sharedInstance.labelChange     
    }
    var labelChange: String = Model().callElements() {
        willSet {
            updateLabel()
        }
    }
    static let sharedInstance = SharingManager()
}

第一个VC:

class ViewController: UIViewController {
    @IBOutlet weak var label: UILabel!
    @IBAction func Button(sender: UIButton) {    
       SViewController().updateMessageAndDismiss()
    }
}

第二个VC:

func updateMessageAndDismiss() {
        SharingManager.sharedInstance.labelChange = modelFromS.callElements()
        self.dismissViewControllerAnimated(true, completion: nil)
    }
@IBAction func b2(sender: UIButton) { 
        updateMessageAndDismiss()
}

我做了一些改进,但是我需要引用单例中第一个VC类的标签。因此,我将在单例中更新该VC标签。

当我打印时,值labelChange的值正在更新,一切都很好。但是,当我尝试从单例更新标签上的值时,出现错误:

展开Optional值时意外发现nil

错误指向单例类的第4行。

丹尼斯

您可以简单地使用变量的属性观察器labelChange,并在内部调用要调用的函数didSet(或者willSet如果要在设置之前调用它):

class SharingManager {
    var labelChange: String = Model().callElements() {
        didSet {
            updateLabel()
        }
    }
    static let sharedInstance = SharingManager()
}

这在“属性观察器”中进行了说明

我不确定为什么尝试这种方法时不起作用,但是如果由于尝试调用的函数(updateLabel)处于其他类而遇到麻烦,则可以在SharingManager该类中添加一个变量以存储该函数在被调用时didSet调用,updateLabel在这种情况下您将设置为


编辑:

因此,如果要从ViewController编辑标签,则希望在ViewController类中具有该updateLabel()函数来更新标签,但将该函数存储在singleton类中,以便它可以知道要调用哪个函数:

class SharingManager {
    static let sharedInstance = SharingManager()
    var updateLabel: (() -> Void)?
    var labelChange: String = Model().callElements() {
        didSet {
            updateLabel?()
        }
    }
}

然后在具有您要调用的函数的任何类中进行设置,例如(假设updateLabel是您要调用的函数):

SharingManager.sharedInstance.updateLabel = updateLabel

当然,您将需要确保负责该功能的视图控制器仍然存在,以便单例类可以调​​用该功能。

如果需要根据可见的视图控制器调用不同的函数,则可能需要考虑“键值观察”以在某些变量的值更改时获取通知。

同样,您永远也不想像这样初始化视图控制器,然后立即设置视图控制器的IBOutlet,因为在实际加载其视图之前,IBOutlets不会被初始化。您需要以某种方式使用现有的视图控制器对象。

希望这可以帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

程序在执行期间更改变量值

来自分类Dev

在PHP中的变量内更改变量值

来自分类Dev

在调试JavaScript时,是否可以更改变量值?

来自分类Dev

更改变量值时出现“ alert”错误

来自分类Dev

尝试更改变量值时出现总线错误

来自分类Dev

在各种getinterval中纠缠在一起时,如何更改变量值?

来自分类Dev

使按钮更改变量值的快速简便方法?

来自分类Dev

使用GDB在JVM中更改变量值

来自分类Dev

在julia中声明和更改变量值的问题

来自分类Dev

如何使用if条件在python中更改变量值

来自分类Dev

如何使用if条件在python中更改变量值

来自分类Dev

如何使用if条件在python中更改变量值

来自分类Dev

如何使用if条件在python中更改变量值

来自分类Dev

如何在JasperReports中按需更改变量值

来自分类Dev

在ColdFusion中的请求之间更改变量值

来自分类Dev

从 Haskell 中的列表更改变量值

来自分类Dev

使用函数中的内容更改变量值

来自分类Dev

在Java中更改变量值的最常规方法是什么?

来自分类Dev

std :: cout更改变量值

来自分类Dev

从对象字段更改变量值

来自分类Dev

常量更改变量值

来自分类Dev

用循环更改变量值

来自分类Dev

Java if语句更改变量值

来自分类Dev

无法更改变量值javascript

来自分类Dev

选中/取消选中复选框时更改变量值

来自分类Dev

尝试根据if_else条件更改变量值时,dplyr出现mutate()错误

来自分类Dev

如何在单击按钮时做出反应以更改变量值

来自分类Dev

选中/取消选中复选框时更改变量值

来自分类Dev

在 Blazor 上按下输入键时更改变量值