Вернуться к корневому представлению в IOS

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

Вот что я хочу сделать:

Приложение начинается с представления A.

Представление A запускает представление B, а представление B запускает представление C.

Является ли это способом для представления C вернуться непосредственно обратно к A, не закрывая себя и, таким образом, открывая B. Например, кнопку главного меню.


person Andrew S    schedule 27.01.2012    source источник


Ответы (2)


Вы можете вызвать popToRootViewControllerAnimated:, если у вас есть UINavigationController. Если вы укажете NO для его анимации, то он просто вернется к корню, не показывая сначала B.

person Magic Bullet Dave    schedule 27.01.2012
comment
Я пытаюсь [self.navigationController popToRootViewControllerAnimated: NO]; в заглушке события IBAction, запущенной кнопкой главного меню. Кажется, что это не имеет никакого эффекта, но выполняется без возникновения ошибки. - person Andrew S; 27.01.2012
comment
Хорошо, первый вопрос: есть ли у вас UINavigationController и вы помещаете свои представления (через их собственные контроллеры представлений) в стек? У каждого контроллера представления есть свойство navigationController, но для него может быть установлено значение nil. - person Magic Bullet Dave; 27.01.2012
comment
Взгляните на developer.apple.com /library/ios/#documentation/uikit/reference/, чтобы узнать, тот ли это эффект, который вы пытаетесь воспроизвести. - person Magic Bullet Dave; 27.01.2012
comment
Когда я запускаю представления, я использую [self presentModalViewController: exportMenu анимированный: YES]. Похоже, что этот контроллер self.navigation имеет значение null. - person Andrew S; 27.01.2012
comment
Итак, вы представляете контроллеры модального представления поверх других контроллеров модального представления, верно? Было бы полезно, если бы вы могли немного подробнее объяснить эффект, который вы пытаетесь создать, чтобы я мог дать вам лучший совет. - person Magic Bullet Dave; 27.01.2012
comment
Мне кажется странным, что этот навигационный контроллер необходим. Такая функциональность должна быть стандартной в любом представлении IOS. Поскольку в памяти есть стек, можно было бы ожидать, что можно перейти в любую позицию в этом стеке, что затем отклонит все последующие представления из выбранной позиции. - person Andrew S; 27.01.2012
comment
Я просто хочу иметь возможность вернуться к первому представлению в стеке, которое является главным меню приложений. Я хотел бы, чтобы все мои представления имели кнопку главного меню, чтобы облегчить это. - person Andrew S; 27.01.2012
comment
О, и да, я представляю контроллеры модального представления друг над другом. - person Andrew S; 27.01.2012
comment
Представления iOS обычно управляются контроллером представления, а коллекции (или стеки) контроллеров представления управляются одним из классов-контейнеров контроллера представления, например UITabBarController или UINavigationController, и именно для этого они предназначены. - person Magic Bullet Dave; 27.01.2012
comment
Спасибо за ваш совет, я придумал другое решение. Я смог довольно хорошо ответить на свой вопрос, я хотел бы поделиться с вами решением, потому что я считаю, что это полезно для других и весьма изобретательно. Однако это удушающее правило: пользователи с репутацией менее 100 не могут ответить на свой вопрос в течение 8 часов, мешает мне сделать это, извините, может быть, позже, а. :( - person Andrew S; 27.01.2012
comment
Конечно, звучит интригующе. - person Magic Bullet Dave; 27.01.2012

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

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

В каждом контроллере представления с кнопкой главного меню я связываю кнопку с методом homePressed IBAction следующим образом. Сначала установите для глобального логического значения homePressed значение YES, затем закройте контроллер представления обычным способом, но с анимацией NO.

-(IBAction) homePressed: (id) sender
{
   [GlobalVars _instance].homePressed = YES;
   [self dismissModalViewControllerAnimated: NO];
}//end homePressed

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

-(void) viewDidAppear: (Bool) animated
{
   if ([GlobalVars _instance].homePressed == YES)
   {
      [self dismissModalViewController: NO];
   }
   else
   {
      //put normal view did appear code here/
   }

}//end viewDidAppead

В контроллере представления mainMenu, который является корнем приложения, я установил для глобального логического значения homePressed значение NO в его точка зрения выглядела следующим образом

-(void) viewDidAppear: (Bool) animated
{
   if ([GlobalVars _instance].homePressed == YES)
   {
      [GlobalVars _instance].homePressed == NO;
   }
   else
   {
      //put normal view did appear code here/
   }

}//end viewDidAppear

Там это позволяет мне вернуться в корневое главное меню моего приложения из любого представления дальше по цепочке.

Я надеялся избежать этого метода, но это лучше, чем повторная реализация моего приложения, что мне пришлось бы сделать, если бы я хотел использовать решение UINavigationController.

Просто, мне потребовалось 10 минут, чтобы закодировать в моем приложении с 9 представлениями. :)

Последний вопрос, который у меня есть, подойдет ли мое решение для HIG?

person Andrew S    schedule 30.01.2012