Каков рекомендуемый способ представления UIViewController модально из любого места? - PullRequest
0 голосов
/ 20 апреля 2011

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

С Three20 я могу использовать - [TTNavigator visibleViewController], чтобы выполнить работу, но что, если я не хочу использовать фреймворк? Должен ли я переопределить пользовательскую функцию, которая действует как TTNavigator? Есть ли похожий метод в Apple API? Может быть, лучше, например, создать общий родительский класс для всех контроллеров в моем приложении, а затем использовать NSNotificationCenter для обработки всех уведомлений приложения? (Это, конечно, будет иметь побочный эффект от несвязанного кода в одном классе)

Я действительно удивлен, что Apple не предоставила эту базовую функциональность в своих стандартных API. Или, может быть, тот факт, что эта проблема повторяется для меня, является признаком плохой практики проектирования?

1 Ответ

1 голос
/ 20 апреля 2011

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

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

В качестве альтернативы, вы можете отказаться от идеи отображения модальных контроллеров представления и прикрепить представление непосредственно к окну вашего приложения. Если вы посмотрите на довольно популярную библиотеку, такую ​​как MBProgressHUD, то увидите, что можете присоединить модальные представления загрузки, предлагаемые к окну приложения, в котором находятся все ваши контроллеры представления.

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

...