У меня есть два контроллера вида: LocationsViewController
и SettingsViewController
. LocationsViewController
соответствует протоколу SettingsViewControllerDelegate
. Этот протокол содержит только один метод:Элегантный способ обмена и изменения массива между контроллерами вида
// SettingsViewControllerDelegate.h
- (void)settingsViewControllerDidFinish:(SettingsViewController *)controller;
Когда мой LocationsViewController
получает этот делегат сообщения, он отклоняет SettingsViewController
, который был представлен модально.
Я думаю, что это хороший дизайн кода до сих пор. Проблема заключается в совместном использовании данных между этими контроллерами представлений. Оба диспетчера представлений представляют одни и те же данные: массив из примерно 10 объектов (местоположений). Только SettingsViewController
позволяет изменять этот массив.
Прямо сейчас я «решил» это неэлегантным образом: оба диспетчера представлений имеют ссылку на делегата моего приложения, а мой делегат приложения имеет свойство locations
. SettingsViewController
изменяет этот массив напрямую. Например:
// SettingsViewController.m
[appDelegate.locations addObject:newLocation];
Это работает, но я не доволен им. Я понимаю, что это плохо, чтобы позволить вашим контроллерам представлений ссылаться на делегат приложения. Какие-либо предложения?
В этом случае вы должны обязательно использовать синглтон. В течение 2016 года будьте осторожны, если вы используете * последнюю * правильную идиому для использования Singleton в Swift. В iOS есть синглтоны сверху вниз (ваш делегат приложения - одноэлементный, ваш ускоритель - синглтон, почти все на телефоне - синглтон), поэтому вы не можете сделать ничего, кроме самого тривиального приложения для iOS, не используя singleletons.BUT if вы учащийся, не делайте одиночных одиночек. Они критичны, но относятся с осторожностью. – Fattie