2010-11-09 2 views
1

У меня есть два контроллера вида: LocationsViewController и SettingsViewController. LocationsViewController соответствует протоколу SettingsViewControllerDelegate. Этот протокол содержит только один метод:Элегантный способ обмена и изменения массива между контроллерами вида

// SettingsViewControllerDelegate.h 
- (void)settingsViewControllerDidFinish:(SettingsViewController *)controller; 

Когда мой LocationsViewController получает этот делегат сообщения, он отклоняет SettingsViewController, который был представлен модально.

Я думаю, что это хороший дизайн кода до сих пор. Проблема заключается в совместном использовании данных между этими контроллерами представлений. Оба диспетчера представлений представляют одни и те же данные: массив из примерно 10 объектов (местоположений). Только SettingsViewController позволяет изменять этот массив.

Прямо сейчас я «решил» это неэлегантным образом: оба диспетчера представлений имеют ссылку на делегата моего приложения, а мой делегат приложения имеет свойство locations. SettingsViewController изменяет этот массив напрямую. Например:

// SettingsViewController.m 
[appDelegate.locations addObject:newLocation]; 

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

+0

В этом случае вы должны обязательно использовать синглтон. В течение 2016 года будьте осторожны, если вы используете * последнюю * правильную идиому для использования Singleton в Swift. В iOS есть синглтоны сверху вниз (ваш делегат приложения - одноэлементный, ваш ускоритель - синглтон, почти все на телефоне - синглтон), поэтому вы не можете сделать ничего, кроме самого тривиального приложения для iOS, не используя singleletons.BUT if вы учащийся, не делайте одиночных одиночек. Они критичны, но относятся с осторожностью. – Fattie

ответ

1

Для ситуаций, подобных этому, я использую объект singleton Settings. Это всего лишь NSObject, который имеет методы для настроек в моем приложении. Я получаю экземпляр, вызывая +[Settings settings]. Некоторые настройки - это всего лишь обертка вокруг NSUserDefaults, и в этом случае я просто определяю статические методы.

Одиночные игры точно не считаются лучшей практикой, но они используются повсеместно в SDK (плюс, проходя мимо экземпляра настроек, чтобы все быстро раздражали).

+0

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

3

Возможно, вы захотите, чтобы наблюдатель наблюдал за изменениями в массиве, я думаю. Я мог бы набрать что-то, но в StackOverFlow уже есть отличные ответы.

Key Value Observing with an NSArray

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