2010-12-09 3 views
0

Я пытаюсь дублировать дизайн почтового приложения на iPhone. На панели инструментов метка обновляется/изменяется, чтобы отображать статус отправляемой почты.iPhone - UIToolbar - метод делегирования/уведомление/KVC

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

Для единства, скажем, у меня есть следующие виды: A -> B -> C - D. A, B и C нажимаются и выходят из UINavigationController и имеют соответствующую панель инструментов. D - это «составное» окно и является модальным окном C. И позволяет вызвать объект, который я пытаюсь создать, это obj.

Делегат

Это потребовало бы мне создать один obj в A и передать его B и C. C назвал бы такой метод, как sendMail, по адресу obj, и он попытается отправить электронное письмо. «obj» будет иметь метод делегирования obj:hasUpdateForToolbar:, который отправляет массив в делегированный класс (C), чтобы обновить панель инструментов. Через процесс отправки он отправил несколько сообщений, чтобы обновить индикатор выполнения, а в конце сказать, что он был успешно отправлен или дата, когда произошла последняя проверка электронной почты.

Проблема с этим решением не обновляется A или B. Когда вызывается C, делегат должен быть переназначен до B, и будет (я думаю) вспышка старого значения на панели инструментов до того, как следующее значение будет нажато obj.

Уведомление

Это было бы чище, чем делегат в том, что вы не должны передавать объект к каждому классу, что означает меньшую зависимость между классами). Но поскольку у вас нет связи, вам нужно будет отправить C сообщение о том, что есть новое письмо, готовое к отправке. obj должен будет получить это уведомление, а затем будет отправлять новые уведомления вместо метода делегата.

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

КВЦ

Я действительно не знаю, как я мог установить это так, что кодирование Key-Value заботится о нем. Могу ли я настроить вид в obj, который попадает на панель инструментов каждого вида, и по мере его обновления (с меткой или индикатором выполнения) это будет отражено на каждой панели инструментов?

Итак, что лучше/что я пропущу на них?

ответ

0

У вас есть контроллер приложения (может быть ваш AppDelegate или другой объект, видимый во всем мире.)

Этот контроллер приложений отвечает за создание моделей (получение электронной почты, отправка электронной почты и т. Д.) И пользовательский интерфейс (экран компоновки, UINavigationController, ViewControllers и т. Д.). Этот контроллер приложения также будет отвечать за содержимое панели инструментов: кнопки «Обновить» и «Создать» и область состояния.

Контроллеры представлений в стеке навигации не будут беспокоиться о содержании этой панели инструментов, они просто получат элементы панели инструментов (Compose, Reload, Status) из контроллера приложения.

Контроллер приложения должен обновлять содержимое области состояния панели инструментов на основе состояния своей модели (отправка, прием и т. Д.). Связь между контроллером приложения и его моделью будет тогда типичным КВО или уведомлениями.

+0

Это имеет большой смысл. Я закончил тем, что просто передал делегат через каждый объект, так как не каждый просмотр в моем приложении нуждался в доступе к нему. Спасибо за ответ. – RyanJM 2010-12-21 14:28:40

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