2013-07-28 3 views
0

У меня есть раскадровка настроить с помощью модальных переходов следующим образом:Очистка обратно стек на переходе

корень -> A -> B -> C

Когда переход от В к С, я хочу, чтобы очистить backstack, потому что пользователь никогда не сможет вернуться к A, B или root. Я знаю, что невозможно удалить контроллер корневого представления, но есть ли способ удалить A и B из стека при переходе на C.

У меня есть фон Android, и там это можно сделать, просто добавив CLEAR_TOP и Новый флаг NEW_TASK перед началом следующего действия. Есть что-то подобное в iOS?

Я пытаюсь вызвать это при переходе с B-> C, но это приводит к сбою приложения.

[self dismissViewControllerAnimated:NO completion:nil]; 

Также попробовал это на виду. Загрузить B, но он не работает.

[self.presentingViewController dismissViewControllerAnimated:NO completion:nil]; 

РЕДАКТИРОВАТЬ: Возможно ли сделать C корнем и очистить A-> B и предыдущий корень. Как бы Вы это сделали?

+1

Возможно, вы можете использовать 'UINavigationController' для достижения того, чего хотите. После B-> C просто очистите стек контроллера. – Andrew

+0

Основная причина использования модального заключается в том, что я хочу использовать переход «свернуть по горизонтали».Я не уверен, как сделать эту анимацию с помощью push. – Naveed

ответ

3

Все, что вам нужно сделать, это установить себя в качестве контроллера зрения корня окна в методе viewDidAppear С.

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    self.view.window.rootViewController = self; 
} 

корень, и B будет высвобождено, когда вы сделаете это.

+0

Благодарим за упоминание части освобождения. Я думал, что я буду создавать утечку памяти, просто изменив root (т. Е. Предыдущие представления все равно будут всплывать). – Naveed

0

Вы пробовали -removeFromSuperview

+0

Вы ссылаетесь на [self removeFromParentViewController] Я пробовал это, он не работает. Предыдущее представление, в этом случае B все еще существует. – Naveed

1

Может быть, вы можете использовать UINavigationController, чтобы достичь того, чего вы хотите. После B-> C просто очистите стек контроллера. Вы можете пользовательский переход стиль UINavigationController так:

CATransition *animation = [CATransition animation]; 
[animation setDuration:0.3]; 
[animation setType: kCATransitionMoveIn]; 
[animation setSubtype: kCATransitionFromTop]; 
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]]; 

[nav pushViewController:yourViewController animated:NO]; 

[nav.view.layer addAnimation:animation forKey:nil]; 
+0

См. Править – Naveed

+0

Я никогда не использовал раскадровку. Я думаю, вам нужно связать кнопку «Далее» с методом действия, в котором вы 1) назначьте и инициализируйте свой второй контроллер представления и 2) используйте фрагмент кода, чтобы нажать его в UINavigationController. – Andrew

+0

Обратите внимание, что вы можете заменить корень, A и B на C с помощью метода 'setViewControllers: анимированный:' вместо 'pushViewController: animated:' и анимировать его таким образом. – lnafziger

0

Один подход вы можете использовать это:

корне-> A -> B -> C -> (fakeRoot) => (вещественный корень)

Перед отъездом корня, вы можете создать снимок корня (like this)

Затем вы можете использовать ваши фантазии перехода модального переход к «фальшивому корню», но поставить реальный корень позади него, в тип контроля Если вы хотите двигаться вперед. Затем просто удалите поддельный корень, чтобы открыть реальный.

  • Сделать ViewController называется «fakeRoot» контроллер, который был просто большой ImageView, который заполняет экран
  • Установите ImageView к образу «корень», который вы создали с выше снимка.
  • сделать свой модальный переход к этому ImageView
  • поп в корень вашего контроллера нав без анимации (который должен сделать корень появляться, но вы не заметите, потому что ваш модально представлен вид будет выглядит точно так же, как это)
+0

Мне тяжело обволакивать то, что вы сказали. Можете ли вы, может быть, разработать. Также см. Править. Я бы предпочел сделать это, используя модальный переход, но я могу сделать push, если это лучший способ справиться с предыдущим стеком. – Naveed

Смежные вопросы