У меня есть класс и вид, которые никак не связаны. Мне нужно создать событие таким образом, чтобы при его повышении я хочу изменить текст ярлыка в другом представлении. Какой был бы самый правильный и элегантный способ сделать это?Как поднять событие с другого контроллера.
ответ
Похоже, вы ищете Event Bus AKA Опубликовать/Подписываться.
Это означает, что ваш контроллер может публиковать «события», и ваши представления могут стать «слушателями» этих событий. И поэтому, когда вызывается событие, ваши взгляды реагируют.
Посмотрите на библиотеку this open-source для простого способа сделать это.
Существует множество способов достичь этого. Вы можете использовать протоколы, уведомления, наблюдение за ключевыми значениями и т. Д. Если вы используете Reactive Cocoa, вы можете использовать темы, сигналы для их подписания.
Поскольку они не связаны напрямую и не связаны друг с другом, использование делегата - не самый лучший вариант.
NSNotification всегда работает, но вы должны быть осторожны, добавляя и удаляя наблюдателей в надлежащих местах. Возможно, вы закончите сбой своего приложения. Уведомления также очень трудно отлаживать, поскольку нет прямой связи, а только наблюдатели и издатели. Попытайтесь централизовать его и ограничьте его, чтобы избежать побочных эффектов.
KVO также можно наблюдать состояние другого объекта и отражать это на другом объекте. Это безопаснее, чем при использовании обычных уведомлений, но все еще сильно связано.
Я бы попытался связать их в другом объекте. Они могут разговаривать через другой вспомогательный объект. Также это лучше, если вы хотите улучшить эту связь. Вы можете легко отслеживать дорожку и изменять связанные значения.
Вариант 1: Вы можете использовать шаблон делегирования.
Создать протокол делегата. Класс контроллера вида должен соответствовать этому делегату. Всякий раз, когда вам нужно инициировать событие, просто вызовите этот метод делегата из своего класса. Это также вызовет функцию в классе контроллера вида, где вы обновите текст метки.
Проверка this link для хорошо объясненного учебника.
Вариант 2: Используйте КВО (значение ключа наблюдения)
Проверить this link больше о КВО.
Комментарий, если вам нужны дополнительные примеры кода.
Класс и представление не имеют ссылки друг на друга. Нет никаких экземпляров класса или представления, с которыми они могут разговаривать через делегата. – erenkabakci
Вы правы, если это так. Но вопрос казался мне несколько неоднозначным. Поэтому я оставляю это как вариант, пока не будет предоставлено дополнительное разъяснение. – mohonish
Похоже, вы описываете, что именно такое Reactive Programming. Когда ваша модель меняется, вы хотите, чтобы ваши взгляды были соответствующим образом обновлены.Есть два больших ЛИЭС, которые могут справиться с этим для вас:
- ReactiveCocoa (RAC 4), если вы хотите, чтобы это было совместимо с Swift2
- RxSwift который является немного более легким, но очень мощным, а также
Я предлагаю вам вникать в это и начать пользоваться парадигмой реактивного программирования
Если ваши классы не имеют ссылки на друг друга, и их действительно сложно подключить, используйте UINotificatio nCenter:
- 1. Поднять событие Button_Click() другого приложения
- 2. Как поднять общее событие?
- 3. Как поднять событие поперечной нити
- 4. Пытается поднять событие C#
- 5. Как поднять событие на Mainwindow
- 6. Как программно поднять SizeChanged событие
- 7. Как поднять событие внутри задачи?
- 8. Как поднять событие на tcplistener.accepttcpclient
- 9. Как поднять событие с помощью Moq?
- 10. Как поднять событие с помощью addHandler
- 11. Поднять событие TreeViewItem.MouseDoubleClickEvent
- 12. Поднять событие из задачи
- 13. Поднять событие в C#
- 14. Поднять событие в VB.NET
- 15. Поднять событие события на элемент из другого шаблона
- 16. Поднять событие класса из другого класса в C#
- 17. Получить событие от другого контроллера вида
- 18. Событие PropertyChanged, поднять, когда OnClick?
- 19. Поднять событие или вернуть bool?
- 20. Поднять пользовательское событие в мультипроекте
- 21. Поднять событие с помощью SynchronizationContext в Silverlight
- 22. Поднять событие в указанное время
- 23. Поднять событие на файл чтения?
- 24. Поднять событие mousemove на элементе
- 25. Поднять событие с помощью общего метода
- 26. Как я могу поднять событие в объекте
- 27. Поднять событие в другом контексте
- 28. Как поднять событие, добавить поля в Ajax?
- 29. Как поднять событие при назначении нового обработчика?
- 30. Как поднять событие в Угловом 1.5 Компонент
Можете ли вы предоставить более подробную информацию о классе и зрения? – Masterfego
В классе A добавьте наблюдателя для этого события, а из класса B просто опубликуйте уведомление для этого наблюдателя. Просто. Если понадобится какой-то код, то дайте мне знать. –