модальное представление iphone - как вернуться к родительскому родительскому контроллеру - PullRequest
2 голосов
/ 22 июня 2011

У меня есть несколько представлений, которые я открываю один за другим модально.View1 вызывает View2, а View2 вызывает View3.
Я использую этот код для вызова следующего представления:

   View2 *myView = [[View2 alloc] initWithNibName:@"View2" bundle:[NSBundle mainBundle]];   

    [self presentModalViewController:myView animated:YES];

    [myView release];

Если пользователь нажимает кнопку отмены, он возвращается к одному представлению ... 3 к 2 и 2 к 1

[self.parentViewController dismissModalViewControllerAnimated:YES];

Что мне нужно сделать, это когда пользователь находится на View3, если он не выбирает отмену, а завершает операцию, тогда мне нужно вернуться к View1 и освободить View2 и View3.

Как мне это сделать?

РЕДАКТИРОВАТЬ: ОСНОВНОЕ ОКНО имеет Navcontroller и 6 контроллеров представления.Я называю View 1 следующим образом: :

View1 *screen = [[View1 alloc] initWithNibName:@"View1" bundle:[NSBundle mainBundle]];
    self.Search = screen;

    [mainNavController presentModalViewController:screen animated:YES];

    [screen release];

EDIT # 2: Основные вызовы Windows View 1. Главное окно имеет NavController в XIB, это работает:

    View1 *screen = [[View1 alloc] initWithNibName:@"View1" bundle:[NSBundle mainBundle]];


[mainNavController presentModalViewController:screen animated:YES];

[screen release];

Затем в XIB на View 1 я добавил NavController и привязал его к View1NavController в .h

View 1, затем вызывает view 2:

   View2 *myView = [[[View2 alloc] initWithNibName:@"View2" bundle:nil] autorelease];

UINavigationController * navController = [[[UINavigationController alloc] initWithRootViewController:myView] autorelease]; 

[View1NavController presentModalViewController:navController animated:YES];

Когда явыполнить это, без ошибок, но он не показывает View2.

Ответы [ 2 ]

5 голосов
/ 22 июня 2011

Почему вы не используете UINavigationController? Вы можете использовать popToRootViewControllerAnimated: и popViewControllerAnimated: для своих целей.

Как таковой, если вы делаете,

[self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];

Вы должны вернуться к 1.

Выдержка из dismissModalViewControllerAnimated,

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

Использование контроллера навигации

Чтобы контроллер навигации работал, вместо того, чтобы загружать ваш view1, вы сделаете это,

View1 *myView = [[[View1 alloc] initWithNibName:@"View1" bundle:nil] autorelease]; 
UINavigationController * navController = [[[UINavigationController alloc] initWithRootViewController:myView] autorelease]

[mainNavController presentModalViewController:navController animated:YES];

Это предполагает, что view1 было rootViewController

После настройки контроллера навигации вы можете загрузить view2, например,

View2 *myView = [[View2 alloc] initWithNibName:@"View2" bundle:[NSBundle mainBundle]];   
[self.navigationController pushViewController:myView animated:YES];
[myView release];

В таком случае

Отмена

[self.navigationController popViewControllerAnimated:YES];

Complete

[self.navigationController popToRootViewControllerAnimated:YES];
0 голосов
/ 22 июня 2011

Кажется, что нет умного пути, попробуйте этот глупый:

  UIViewController *vc = self;
  while(vc.parentViewController.modalViewController == vc){
    [[vc retain] autorelease];
    [vc dismissModalViewControllerAnimated:NO];
    vc = vc.parentViewController;
  }
...