Передайте UIViewController / UIView между представлениями вкладок UITabBar - PullRequest
0 голосов
/ 12 августа 2011

В конечном счете, я хотел бы знать, как сохранить UIView (глобально, если необходимо) из одного контроллера представления, чтобы на него можно было ссылаться и вызывать обратно вверх из другого контроллера представления?

Я создал приложение, в котором две главные вкладки имеют вкладку «Главная страница» и вкладку «Руководство», но функциональность вкладки «Руководство» несколько уникальна тем, что это динамическая вкладка, которая в идеале будет отображать различное содержимое в зависимости от того, что«Гид» был выбран на вкладке «Главная».Таким образом, на вкладке «Главная» есть несколько кнопок UIB, которые предназначены для загрузки данного руководства.Каждое руководство - это просто набор изображений, с которыми пользователь может взаимодействовать.Никаких проблем там нет.

Теперь на вкладке «Главная», когда пользователь выбирает руководство, которое он хочет просмотреть, я хотел перейти между вкладкой «Главная» и вкладкой «Руководство» с анимированным переходом CurlDown.Это единственное место, где у меня будет анимация перехода UIView - это означает, что обычное переключение вкладок пользователем будет стандартным мгновенным переходом без эффектов.

Вот как я реализовал переход с домашнего на руководство, когда пользователь выбирает руководство на вкладке «Главная».Это делается в HomeViewController как IBAction, назначенный всем UIB-кнопкам с направляющей загрузкой, каждая из которых имеет уникальный тег, который сообщает GuideViewController, какое руководство загружать:

- (IBAction)loadGuide:(id)sender
{
UIButton *button = (UIButton*) sender;
GuideViewController *guideController = [[GuideViewController alloc] initWithNibName:@"GuideViewController" bundle:nil];
self.guideViewController = guideController;
[self.guideViewController activateGuide:button.tag];
[UIView transitionFromView:self.view
                    toView:guideController.view
                  duration:1.0
                   options:UIViewAnimationOptionTransitionCurlDown
                completion:^(BOOL finished){
                    UITabBarItem *tabBarGuide = [[self.tabBarController.tabBar items] objectAtIndex:1];
                    [tabBarGuide setEnabled:TRUE];
                    self.tabBarController.selectedIndex = 1;
                }];
[guideController release];
}
// End (IBAction)loadGuide

Это работает очень хорошо, додо того момента, когда мне нужно будет включить вкладку «Руководство» и перейти к ней.Похоже, что в этот момент создается другой экземпляр GuideViewController, который заменяет тот, который был первоначально создан и переведен из HomeViewController, как показано выше.

Так что я подумал, что, возможно, я мог бы обойти это, вместо этого, переместив загрузку направляющих в новое представление, которое не используется с UITabBar, а затем загрузив и перейдя в это представление со вкладки Home.так же, как я сделал в приведенном выше коде.Затем, после переключения вкладок, мне нужно каким-то образом вызвать его в контроллер представления моей вкладки, в качестве подпредставления или тому подобного.

Я думаю, что после процесса переключения вкладок представление все еще будет существовать в памяти, я просто не знаю, как получить к нему доступ, поэтому я могу показать его снова после того, как представление вкладки Guide скрыло его.Должен ли я назначить представление некоторой глобально доступной переменной из HomeViewController, чтобы я мог затем получить к ней доступ из GuideViewController (представление вкладки Guide)?

Я также открыт для любых альтернативных предложений, если вы считаете, что такой подход плохой!Сначала я попытался решить эту проблему, загрузив детали активного руководства в базу данных, а затем восстановил эти данные, когда включился контроллер представления вкладки «Руководство». Однако представление вкладки «Руководство» должно быть кэшировано или что-то в этом роде, потому что если пользователь возвращаетсяна домашнюю страницу и выбирает новое руководство, он оживит переход к этому руководству, но затем, когда включается переключатель вкладок «Домой к руководству», он переходит обратно в то же состояние, в котором был вид вкладки «Руководство».прежде чем пользователь вернулся на домашнюю страницу, чтобы выбрать новую вкладку.Кроме того, я заметил, что метод ViewDidLoad больше не вызывается при ручном или программном переключении вкладок, поэтому я решил, что другое представление также должно быть в памяти!(«Другое представление», являющееся либо исходным экземпляром представления GuideViewController, инициируемого на вкладке «Главная» после выбора кнопки-указателя, либо новым представлением, как упоминалось ранее, которое, по сути, будет выполнять то же самое, хотя и в отдельном классе.)

Итак, подведем итог:

  • У меня есть две вкладки, Домашняя страница и Руководство
  • Домашняя страница имеет несколько кнопок UIB, которые при нажатии будут загружать определенную направляющую
  • Когданажатие кнопки UIB on Home переходит от вида вкладки «Домой» к представлению вкладки «Справочник» CurlDown без предварительного переключения на вкладку «Руководство», так как это приведет к потере эффекта CurlDown
  • Затем мне нужно программно активировать переключатель табуляции, который, кажется, загружает новый экземпляр вида Guide, который эффективно закрывает другой экземпляр
  • Я хочу знать, могу ли я как-то просто вызвать первый экземпляр, каким-то образом, возможно, сохранив другой экземпляр как глобальный или что-то подобное?
  • Обдумайте вопрос о том, как передать экземпляр UIView вокруг нескольких контроллеров UIView

Ответы [ 2 ]

0 голосов
/ 16 августа 2011

Идеальный подход для этого - сохранить сохраненную ссылку на объект UIView в постоянном объекте, таком как подкласс делегата приложения UIApplicationDelegate.Затем делегат приложения может создать экземпляр представления.Затем каждый контроллер, которому нужно показать представление, просто запросит представление у делегата приложения.Кроме того, если контроллер корневого представления всегда доступен, его также можно сохранить там.

0 голосов
/ 12 августа 2011

Если бы я был на вашем месте, я бы отказался от перехода и просто панели вкладок, как обычно.

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

Я бы тоже прочитал и перечитал HIG от Apple на вкладках.Я думаю, что ваших пользователей смущает, что что-то, кроме кнопок панели вкладок, приводит к переключению выбранной вкладки.

В модели будут данные.Главная вкладка будет указывать модели, какое руководство выбрано.Руководство будет просматривать загрузку своих данных каждый раз, когда оно появляется.

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

Другой вариант - вместо этого представить модальный вид руководства - но частичный скручивание страницы также немного ограничивает пространство на экране..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...