当变量值更改时,我需要执行一个函数。
我有一个单例类,其中包含一个名为的共享变量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] 删除。
我来说两句