У меня есть относительно простое приложение. У меня есть UINavigationController, и у меня всегда есть мой mainViewController. Иногда я нажимаю на контроллер настроек и подзадач. В моем контроллере подстроек пользователь может вносить изменения в ivars в моем mainViewController. Прямо сейчас у меня есть эти ivars, объявленные как свойства, и я устанавливаю их напрямую. Я использую self.navigationController.viewControllers[0]
, чтобы получить ссылку на главный контроллер, а затем установить свойства. Лучше ли использовать NSNotificationCenter?Используйте NSNotificationCenter для установки иваров?
ответ
Это не очень хороший дизайн, чтобы ваши контроллеры настроек знали о вашем основном контроллере. Что произойдет, когда вы добавите больше возможностей для своего приложения в будущем, и больше экранов в приложении нужно иметь дело с изменениями в любых настройках?
Это гораздо лучший дизайн для разделения поведения. Контроллеры представлений настроек должны обновлять «модель настроек». Затем класс, представляющий эту модель, сможет транслировать любые изменения. Использование NSNotificationCenter
для этого является хорошим подходом.
Теперь любой класс, который может заботиться об изменениях в настройках, может зарегистрироваться для соответствующих уведомлений и действовать соответственно при изменении.
Таким образом, у вас могут быть несколько контроллеров представлений или другие классы, которые отвечают на изменения настроек, и ничто в коде настроек не должно заботиться о каких-либо конкретных контроллерах представления или о том, сколько их есть.
Должен ли я использовать NSNotificationCenter или делегаты? Делегаты кажутся лучше для от 1 до 1 отношений, тогда как центр уведомлений лучше для 1 многих отношений. – user1802143
@ user1802143 Делегаты могут использоваться только при наличии одного конкретного прослушивателя. Использование уведомлений допускает любое количество слушателей (ноль или более). Учитывая, что ваше приложение, скорее всего, будет развиваться с течением времени, и что-то вроде настроек может повлиять на несколько частей приложения, использование уведомлений, вероятно, является лучшим выбором в долгосрочной перспективе. – rmaddy
Что вы делаете, это нормально, так как вы можете легко получить ссылку на свой главный контроллер просмотра с ваших контроллеров представлений настроек. Это действительно вопрос предпочтения.
Настоящая цель NSNotificationCenter
заключается в том, когда несколько объектов должны быть уведомлены о событии или где трудно получить ссылку на объект, который вы хотите изменить. NSNotificationCenter
также может сделать ваш код более чистым и простым в изменении.
Например, если вы измените дизайн своего приложения в будущем, например, переместите контроллеры представлений настроек на вкладки, а не нажимаете их на навигационный контроллер, вам может быть труднее изменить основной контроллер своего вида прямо из них ,
Было бы более целесообразно использовать NSNotificationCenter
, если у вас есть разрозненные компоненты в приложении, которые логически не имеют понимания API друг друга. Однако, когда вы показываете представление для контроллера дополнительных параметров, было бы легко иметь объект настроек, который вы могли бы просто передать из mainViewController
в subSettingsViewController
. В контроллере представления суб-настроек в модуле -viewWillDisappear:
убедитесь, что все значения сохранены в вашем объекте настроек. Наконец, в методе -viewWillAppear:
контроллера основного вида вы просто обновите интерфейс основного представления со значениями в своем объекте настроек.
Вот код, чтобы проиллюстрировать это:
MainViewController.m
@interface MainViewController()
@property (nonatomic, strong) MySettings *settings;
@property (nonatomic, strong) SubSettingsViewController *subSettingsViewController;
@end
@implementation MainViewController
- (IBAction) showSubSettings: (id) sender {
[self.subSettingsViewController setSettings: self.settings];
// Present 'subSettingsViewController'
}
- (void) viewWillAppear: (BOOL) animated {
[super viewWillAppear: animated];
// Set values from settings object for various text fields, UI controls, etc.
}
SubSettingsViewController.h
@interface SubSettingsViewController()
@property MySettings *settings;
@end
SubSettingsViewController.м
@implementation SubSettingsViewController
- (void) viewWillDisappear: (BOOL) animated {
[super viewWillDisappear: animated];
// Set values for the appropriate properties in 'self.settings'
[self.settings setValue1: self.textField1.text];
}
- 1. Свифт для обозначения иваров (свойства)
- 2. Инициализация Иваров в Java
- 3. NSNotificationCenter
- 4. NSNotificationCenter для AddressBook db
- 5. Используйте Razor для установки переменной javascript
- 6. Используйте флажок admin для установки параметров конфигурации
- 7. Используйте package.config для установки локального пакета NuGet?
- 8. Используйте wkhtmltopdf для установки ориентации на ландшафт
- 9. Ruby: Используйте String для установки значения хэша
- 10. Используйте javascript для установки значения тега ввода
- 11. Используйте текстовое поле для установки значения переменной
- 12. Используйте NSPageController с Interfacebuilder для установки вида
- 13. Используйте Баш скрипт для установки tmux окон
- 14. Используйте CI-крючок для установки общих переменных
- 15. когда звонить removeObserver для NSNotificationCenter
- 16. Добавление многопользовательских наблюдателей для NSNotificationCenter
- 17. Эквивалент NSNotificationCenter для реагирования нативный?
- 18. Вопрос NSNotificationCenter
- 19. NSNotificationCenter slow?
- 20. Swift NSNotificationCenter?
- 21. ARC: свойство против Иваров: копия, слабого
- 22. Именование иваров с подчеркиванием, какова практическая импликация
- 23. Уточнение NSNotificationCenter
- 24. Сколько памяти делает NSNotificationCenter использует
- 25. Используйте jQuery для установки значения окна выбора для первого параметра
- 26. Используйте #define для замены кода
- 27. VIM: Используйте рабочий каталог в пути установки
- 28. PowerShell Используйте сторонний модуль без его установки
- 29. Используйте Maven Cargo для установки Wildfly с Keycloak
- 30. Используйте поле ввода формы для установки значения anythingSlider
Используйте 'NSNotificationCenter' ... ** для чего? ** –
Вы можете передать указатель на родительский виде контроллер к контроллеру детали в методе инициализации. Вы можете определить некоторый протокол f.e. делегат detailviewcontroller и значение retur для делегирования. Существует много способов: – BergP
Каждый раз, когда пользователь изменяет параметры в контроллере подзадач, попросите NSNotificationCenter передать уведомление mainController, чтобы сообщить об изменении ivars. – user1802143