Поскольку я новичок в objective-c, cocoa и iPhone dev в целом, у меня есть сильное желание получить максимальную отдачу от языка и фреймворков.
Один из ресурсов, который я использую, - это заметки класса CS193P Стэнфорда, которые они оставили в сети. Он включает в себя конспекты лекций, задания и образцы кода, и, поскольку курс был проведен разработчиками Apple, я определенно считаю, что это «из первых уст».
Веб-сайт класса:
http://www.stanford.edu/class/cs193p/cgi-bin/index.php
Лекция 08 связана с заданием по созданию приложения на основе UINavigationController, в котором несколько UIViewController помещены в стек UINavigationController. Так работает UINavigationController. Это логично. Однако на слайде есть несколько строгих предупреждений о взаимодействии между вашими UIViewController.
Я процитирую этот серьезный слайд:
http://cs193p.stanford.edu/downloads/08-NavigationTabBarControllers.pdf
Страница 16/51:
Как не делиться данными
- Global Variables or singletons
- This includes your application delegate
- Direct dependencies make your code less reusable
- And more difficult to debug & test
Ok. Я с этим не согласен. Не бросайте вслепую все свои методы, которые будут использоваться для взаимодействия между контроллером представления, в делегат приложения и ссылаться на экземпляры контроллера представления в методах делегата приложения. Честное слово.
Чуть дальше мы видим этот слайд, на котором рассказывается, что мы должны делать.
Страница 18/51:
Лучшие практики для потока данных
- Выясните точно, о чем нужно сообщить
- Определите входные параметры для вашего контроллера представления.
- For communicating back up the hierarchy, use loose coupling
- Define a generic interface for observers (like delegation)
Затем за этим слайдом следует то, что выглядит как слайд-заполнитель, на котором лектор, по-видимому, демонстрирует лучшие практики, используя пример с UIImagePickerController. Желаю, чтобы видео были доступны! :(
Ладно, итак ... Боюсь, мой objc-fu не такой сильный. Меня также немного смущает последняя строчка в приведенной выше цитате. Я изрядно погуглил по этому поводу и нашел, кажется, приличную статью о различных методах наблюдения / уведомлений:
http://cocoawithlove.com/2008/06/five-approaches-to-listening-observing.html
Метод № 5 даже указывает на делегатов как на метод! За исключением .... объекты могут одновременно устанавливать только одного делегата. Итак, когда у меня есть связь с несколькими контроллерами представления, что мне делать?
Хорошо, это организованная банда. Я знаю, что могу легко использовать свои методы связи в делегате приложения по ссылке на несколько экземпляров контроллера представления в моем appdelegate, но я хочу делать такие вещи правильным способом.
Пожалуйста, помогите мне "поступить правильно", ответив на следующие вопросы:
- Когда я пытаюсь вставить новый контроллер представления в стек UINavigationController, кто должен делать это нажатие. Какой класс / файл в моем коде является правильным местом?
- Когда я хочу повлиять на часть данных (значение iVar) в одном из моих UIViewController, когда я нахожусь в другом UIViewController, каков «правильный» способ сделать это?
- Допустим, у нас может быть только один делегат, установленный в объекте за раз, как будет выглядеть реализация, когда лектор скажет «Определите общий интерфейс для наблюдателей (например, делегирование)». Если возможно, здесь был бы очень полезен пример псевдокода.