我怎样才能更新其他控制器'用户界面迅速?

时间:2015-07-07 03:01:01

标签: ios iphone swift

我的应用中有几个控制器。当我的应用程序在一个控制器中调用一个函数时,我想更新其他控制器' UI。我怎样才能做到这一点?

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 个答案:

答案 0 :(得分:5)

让视图控制器直接通信通常是一种非常糟糕的做法。我会使用NSNotification在视图控制器之间进行通信。通常,您的通知名称以大写字母开头,并以“通知”一词结尾。

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 :(得分:1)

取消括号。调用类函数时不要使用它们。

FirstViewController.updateUI()

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

如果它们不是同时在屏幕上显示,则您实际上不需要更新这两个UI。

答案 2 :(得分:1)

如果您希望所有视图控制器[在这种情况下 - 更新ui]对您的一个视图控制器中的操作做出反应,您尝试发布通知..这就是您在iOS中广播消息的方式

当您完成所需操作后,您可以从视图控制器发布通知。 所有其他View控制器都会订阅该通知,并通过在发布时更新UI来对其做出反应。

以下帖子快速显示发布/观察通知的示例.. https://stackoverflow.com/a/2677015/4236572

http://www.idev101.com/code/Cocoa/Notifications.html也可能会有所帮助