2015-10-12 2 views
0

У меня есть класс и вид, которые никак не связаны. Мне нужно создать событие таким образом, чтобы при его повышении я хочу изменить текст ярлыка в другом представлении. Какой был бы самый правильный и элегантный способ сделать это?Как поднять событие с другого контроллера.

+1

Можете ли вы предоставить более подробную информацию о классе и зрения? – Masterfego

+0

В классе A добавьте наблюдателя для этого события, а из класса B просто опубликуйте уведомление для этого наблюдателя. Просто. Если понадобится какой-то код, то дайте мне знать. –

ответ

1

Похоже, вы ищете Event Bus AKA Опубликовать/Подписываться.

Это означает, что ваш контроллер может публиковать «события», и ваши представления могут стать «слушателями» этих событий. И поэтому, когда вызывается событие, ваши взгляды реагируют.

Посмотрите на библиотеку this open-source для простого способа сделать это.

1

Существует множество способов достичь этого. Вы можете использовать протоколы, уведомления, наблюдение за ключевыми значениями и т. Д. Если вы используете Reactive Cocoa, вы можете использовать темы, сигналы для их подписания.

Поскольку они не связаны напрямую и не связаны друг с другом, использование делегата - не самый лучший вариант.

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

KVO также можно наблюдать состояние другого объекта и отражать это на другом объекте. Это безопаснее, чем при использовании обычных уведомлений, но все еще сильно связано.

Я бы попытался связать их в другом объекте. Они могут разговаривать через другой вспомогательный объект. Также это лучше, если вы хотите улучшить эту связь. Вы можете легко отслеживать дорожку и изменять связанные значения.

1

Вариант 1: Вы можете использовать шаблон делегирования.

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

Проверка this link для хорошо объясненного учебника.

Вариант 2: Используйте КВО (значение ключа наблюдения)

Проверить this link больше о КВО.

Комментарий, если вам нужны дополнительные примеры кода.

+0

Класс и представление не имеют ссылки друг на друга. Нет никаких экземпляров класса или представления, с которыми они могут разговаривать через делегата. – erenkabakci

+0

Вы правы, если это так. Но вопрос казался мне несколько неоднозначным. Поэтому я оставляю это как вариант, пока не будет предоставлено дополнительное разъяснение. – mohonish

1

Похоже, вы описываете, что именно такое Reactive Programming. Когда ваша модель меняется, вы хотите, чтобы ваши взгляды были соответствующим образом обновлены.Есть два больших ЛИЭС, которые могут справиться с этим для вас:

  1. ReactiveCocoa (RAC 4), если вы хотите, чтобы это было совместимо с Swift2
  2. RxSwift который является немного более легким, но очень мощным, а также

Я предлагаю вам вникать в это и начать пользоваться парадигмой реактивного программирования

Смежные вопросы