2013-02-21 3 views
3

Мне нужно прыгать между контроллерами. Например:Прыжки между видами в навигационном контроллере

View1: First screen (Just logo) 
View2: Download Screen 
View3: First app screen (Some Buttons) 
View4-View(N): some app screens 

Когда пользователь вводит приложение приложение переходит к View1-> View2 (загрузки набивать) -> Просмотр 3-> View4-> View5 Затем пользователь пожелает перейти к первому экрану приложения (View3) он делает:

NSArray *array = [self.navigationController viewControllers]; 
[self.navigationController popToViewController:[array objectAtIndex:2] animated:NO]; 

Первый раз, когда пользователь входит в приложении он идет: View1-> View3 (экран загрузки больше не нужен), и у меня есть другой нажимной SEGUE пойти в View3 так позволяет предположить, пользователь получает: View1-> View 3-> View4-> View5, теперь он хочет вернуться к View3, поэтому функция:

NSArray *array = [self.navigationController viewControllers]; 
[self.navigationController popToViewController:[array objectAtIndex:2] animated:NO]; 

Вернет его в View4, и это НЕПРАВИЛЬНО. Как я могу это решить?

+0

предполагая элементы массива добавлены в порядке View1, View3, view4, View5, '[массив objectAtIndex: 2]' не должно дать вам view4 ничего плохого в том, что, '[массив objectAtIndex: 0] = View1 ',' [array objectAtIndex: 1] = View3', '[array objectAtIndex: 2] = View4', который кажется ПРАВИЛЬНЫМ для меня, попробуйте ответить ниже или попробуйте' objectAtIndex: 1' –

+0

Неправильно я имел в виду, что мне нужна функция [self .navigationController popToViewController: [массив objectAtIndex: 2] анимированный: NO]; всегда обращайтесь к view3 независимо от того, что – Dim

+0

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

ответ

2

Ну, если вы используете раскадровки, то вы можете установить свой идентификатор раскадровки uiviewcontrollers и использовать его для выскакивания и нажатия ваших просмотров.

enter image description here

Допустим, ваше имя Раскадровка является MainStoryboard.storyboard

UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard" 
                bundle:nil]; 
SettingsListViewController *settingsVC = [sb instantiateViewControllerWithIdentifier:@"SettingsListViewController"]; // @"SettingsListViewController" is the string you have set in above picture 
[self.navigationController popToViewController:settingsVC animated:YES]; 

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

View1: First screen (Just logo) 
View2: Download Screen 

Поскольку View1 - это только логотип, а View 2 - это представление, которое вы пропускаете, вы можете удалить их из контроллера навигации и сделать View3 своим навигационный контроллер root view controller, и когда вам понадобятся view1 и view2 present them as Modal View Controllers,

, когда вы закончите с ними, скажем; пользователь успешно загрузил окно отклонения логотипа приложения и present Download Screen, если загрузка прошла успешно, а затем отпустите его.

Так что ваш View3 Будет там вид корневой контроллер, позволяет сказать, что ваш на View (п) вы хотите перейти на главный экран, который View3 все, что вам нужно сделать, это позвонить

[self.navigationController popToRootViewControllerAnimated:NO]; 

Когда вы на view(n) и хотите поп-музыки до view(n-1) просто использовать

[self.navigationController popViewControllerAnimated:YES]; 

удачи,

0

в соответствии с вашим использованием sitation непосредственно наименование ViewController

создать экземпляр вашего ViewController, как этот я должен здесь ваше имя ViewController IS-view3Controller

View3Controller view3Controller=[[View3Controller alloc]init]; 
[self.navigationController popToViewController:@"view3Controller" animated:NO] 

или если вы используете раскадровку, то

View3Controller view3Controller=[self.storyboard instantiateViewControllerWithIdentifier:@"view3Controller"]; 

     [self.navigationController popToViewController:@"view3Controller" animated:NO] 
+0

Я получаю: несовместимые типы указателей, отправляющих 'NSString *' в параметр типа 'UiviewController *' – Dim

+0

@ user1891408 Вы используете раскадровки? –

+0

Да, я делаю ...... – Dim

0

Во второй последовательности ваш навигационный стек изменяется, а view3 будет иметь индекс 1, поэтому

[[self.navigationController popToViewController:[array objectAtIndex:1] animated:NO]; 

был бы правильным способом сделать это.

0

Это звучит как View 2 не добавляется к представлению кон массив троллейберов во время выполнения, возможно, из-за того, что вы создали.

Попробуйте удалить SEGUE, что переходы от вида 1> Вида 3 и толкающего пользователя мимо View 2 без анимации, как и логика приложения требует:

// If the user needs to skip ahead to view 3, conditionally push view 2 and view 3 without animating 
[self.navigationController pushViewController:viewController2 animated:NO]; 
[self.navigationController pushViewController:viewController3 animated:NO]; 

В качестве альтернативы, если вы оставили SEGUE на месте вы могли бы не смотрите на размер свойства UINavigationControllerviewControllers и «угадать» на основе размера, пропустили ли вы просмотр 2? Если вы это сделали, вы можете настроить метод popToViewController, чтобы поместить его в правильный индекс. Это, по общему признанию, менее изящное и хрупкое, если вам тоже нужно пропустить другие взгляды.

// Check length of viewController array with 'N' views (pseudo code) 
if (self.navigationController.viewControllers.length == N-1) 
    // View 2 was ignored: pop to objectAtIndex:1 
else 
    // View 2 was included: pop to objectAtIndex:2 
0

Если я правильно вас понял, ваше view3 имеет специальный контроллер представления, так что вы можете использовать такой код:

NSArray *VCs = [self.navigationController viewControllers]; 
for (UIViewController *VC in VCs) 
{ 
    if ([VC isKindOfClass:[**YOUR-VIEW-CONTROLLER** class]]) { 
     [self.navigationController popToViewController:VC animated:NO]; 
    } 
} 

Это просто, и это работает!

-1

Go, как это к определенному контроллеру вида

[self.navigationController popToViewController:[[self.navigationController viewControllers]objectAtIndex:1] animated:YES]; 
0

Я всегда использую это, и это будет прекрасно работать в вашем случае. Фактически следующая строка кода копируется в мои «Заметки» для быстрой копирования/вставки.

Обязательно импортируйте файл ViewController.h, если нет.

for (UIViewController *viewController in self.navigationController.viewControllers) { 
     if([viewController isKindOfClass:["your ViewController" class]]) { 
      [self.navigationController popToViewController:viewController animated:NO]; 
     } 
    } 
0
for (UIViewController* controller in self.navigationController.viewControllers) { 
     if ([controller isKindOfClass:[<Your View Controller Name> class]]) { 
      [self.navigationController popToViewController:controller animated:YES]; 
      return; 
     } 
    } 
Смежные вопросы