2015-07-07 2 views
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()

Пожалуйста, помогите, спасибо!

ответ

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()

Это говорит .. что вы пытаетесь сделать, это очень странно, мягко говоря. Вы не должны использовать функции класса для изменения свойств экземпляров класса. Если одновременно у вас есть оба монитора просмотра на экране, вы должны использовать родительский контроллер, чтобы заставить обоих из них обновлять свой интерфейс, когда вам нужно.

Если они не оба одновременно отображаются на экране, вам не нужно обновлять оба пользовательских интерфейса.

+0

Большое спасибо –

1

Если вы хотите, чтобы все ваши контроллеры вид реагировать [в данном случае - обновление Ui] к действию в одном из контроллера вида, вы пытаетесь вывешивать уведомление .. Вот как вы передаете сообщение в прошивкой

Вы отправляете уведомление от контроллера просмотра, когда ваше желаемое действие завершено. Все остальные контроллеры View подписались на это уведомление и отреагировали на него, обновив свой интерфейс после его публикации.

Ниже пост быстро показывает пример, чтобы отправить/наблюдать уведомления .. https://stackoverflow.com/a/2677015/4236572

http://www.idev101.com/code/Cocoa/Notifications.html также может быть полезным

+0

спасибо! –