如何在Swift中更新其他控制器的用户界面?

3

我的应用中有几个控制器。当我的应用在一个控制器中调用一个函数时,我希望更新其他控制器的用户界面。我该如何实现这个功能?

class FirstViewController: UIViewController {
    func updateUI {...}  
}

class SecondViewController: UIViewController {
    func updateUI {...}  
}

class ThirdViewController: UIViewController{
    func updateAllUI {...} # I want call FirstViewController().updateUI() and SecondViewController().updateUI() here
}

但是,FirstViewController() 表示我创建了一个新的 FirstViewController,这不是我想要的,而且 FirstViewController 已经被创建。那么在 updateAllUI() 中,我如何调用所有其他控制器的 updateUI() 呢?

请帮忙,谢谢!

3个回答

5
通常来说,让视图控制器之间直接通信是一种不好的做法。我建议使用NSNotification在视图控制器之间进行通信。按照惯例,您应该将通知名称以大写字母开头,并以单词“Notification”结尾。
class FirstViewController: UIViewController {
    func updateUI {...}  

    override func viewDidLoad() {
        super.viewDidLoad()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateUI", name:"TimeToUpdateTheUINotificaiton", object: nil)
    }

    override deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
}
}

class SecondViewController: UIViewController {
    func updateUI {...}  

    override func viewDidLoad() {
        super.viewDidLoad()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateUI", name:"TimeToUpdateTheUINotificaiton", object: nil)
    }

    override deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
}



class ThirdViewController: UIViewController{

    func updateAllUI {
        NSNotificationCenter.defaultCenter().postNotificationName("TimeToUpdateTheUINotificaiton", object: nil)
    }
}

1
消除括号。在调用类函数时不需要使用它们。

FirstViewController.updateUI()

那么,说实话,你试图做的事情至少非常奇怪。您不应该使用类函数来修改类的实例属性。如果您同时在屏幕上拥有两个视图控制器,则应使用父控制器在需要时命令它们两个更新其UI。
如果它们不同时在屏幕上,则您不需要更新两个UI。

1
如果您希望所有视图控制器对其中一个视图控制器的操作做出反应(在本例中是更新UI),您可以尝试发布通知。这就是在iOS中广播消息的方式。
当您所需的操作完成时,您可以从视图控制器发布通知。所有其他视图控制器都将订阅该通知,并在发布通知时通过更新其UI来对其做出反应。
下面的文章快速展示了发布/观察通知的示例。 https://dev59.com/knE85IYBdhLWcg3wpFOu#2677015 http://www.idev101.com/code/Cocoa/Notifications.html也可能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接