2013-08-21 2 views
0

У меня есть относительно простое приложение. У меня есть UINavigationController, и у меня всегда есть мой mainViewController. Иногда я нажимаю на контроллер настроек и подзадач. В моем контроллере подстроек пользователь может вносить изменения в ivars в моем mainViewController. Прямо сейчас у меня есть эти ivars, объявленные как свойства, и я устанавливаю их напрямую. Я использую self.navigationController.viewControllers[0], чтобы получить ссылку на главный контроллер, а затем установить свойства. Лучше ли использовать NSNotificationCenter?Используйте NSNotificationCenter для установки иваров?

+3

Используйте 'NSNotificationCenter' ... ** для чего? ** –

+0

Вы можете передать указатель на родительский виде контроллер к контроллеру детали в методе инициализации. Вы можете определить некоторый протокол f.e. делегат detailviewcontroller и значение retur для делегирования. Существует много способов: – BergP

+0

Каждый раз, когда пользователь изменяет параметры в контроллере подзадач, попросите NSNotificationCenter передать уведомление mainController, чтобы сообщить об изменении ivars. – user1802143

ответ

3

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

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

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

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

+0

Должен ли я использовать NSNotificationCenter или делегаты? Делегаты кажутся лучше для от 1 до 1 отношений, тогда как центр уведомлений лучше для 1 многих отношений. – user1802143

+0

@ user1802143 Делегаты могут использоваться только при наличии одного конкретного прослушивателя. Использование уведомлений допускает любое количество слушателей (ноль или более). Учитывая, что ваше приложение, скорее всего, будет развиваться с течением времени, и что-то вроде настроек может повлиять на несколько частей приложения, использование уведомлений, вероятно, является лучшим выбором в долгосрочной перспективе. – rmaddy

1

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

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

Например, если вы измените дизайн своего приложения в будущем, например, переместите контроллеры представлений настроек на вкладки, а не нажимаете их на навигационный контроллер, вам может быть труднее изменить основной контроллер своего вида прямо из них ,

0

Было бы более целесообразно использовать 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]; 
} 
Смежные вопросы