popToRootViewControllerAnimated не отображает контроллер корневого представления - PullRequest
5 голосов
/ 18 января 2012

Мне нужна небольшая помощь по проблеме с навигационными контроллерами.

У меня navigationController с нажатием 4 ViewControllers.Последний vc, который я нажимаю, представляет еще ViewController модально.Модал ViewController представляет ActionSheet.В зависимости от ответа пользователя я либо отклоняю только модальный ViewController, либо хочу вернуться к корню ViewController.

В ViewController, представленном модально, у меня есть:

- (void) dismissGameReport
{    
    [[self delegate] GameReportModalWillBeDismissed:modalToPopToRoot];    
}

В последнем ViewController, помещенном в стек navigationController, у меня есть:

- (void)GameReportModalWillBeDismissed: (BOOL)popToRoot;
{    
    if (popToRoot) 
        {
        [self.navigationController popToRootViewControllerAnimated:NO];
        }
    else 
        {
        [self dismissModalViewControllerAnimated:YES];
        }            
}

Увольнение контроллера модального вида работает нормально.Однако

[self.navigationController popToRootViewControllerAnimated:NO];

не заставляет корень ViewController отображать свои представления.Добавляя некоторую информацию журнала, я вижу, что после сообщения на self.navigationController стек корректно выталкивается, но выполнение продолжается последовательно.На экране все еще отображается вид модального ViewController.

В качестве обходного пути я всегда пытался отклонить модальный контроллер вида, и в методе ViewWillAppear было сообщение popToRootAnimated.Нет разницы.Все еще стек контроллеров выталкивается, но на экране продолжает отображаться вид контроллера моего модального представления, и выполнение продолжается последовательно.

Может кто-нибудь помочь мне, пожалуйста?

1 Ответ

6 голосов
/ 19 января 2012

Мне нравятся эти обманчивые вопросы.Это кажется очень простым, пока вы не попытаетесь это сделать.

Я обнаружил, что в основном вам нужно отклонить этот контроллер модального представления, но если вы попытаетесь открыть контроллер навигации на следующей строке, то все получитсяперепуталВы должны убедиться, что увольнение завершено, прежде чем пытаться поп.В iOS 5 вы можете использовать dismissViewControllerAnimated:completion: примерно так.

-(void)GameReportModalWillBeDismissed:(BOOL)popToRoot{    
    if (popToRoot){
        [self dismissViewControllerAnimated:YES completion:^{
            [self.navigationController popToRootViewControllerAnimated:YES];
        }];
    }
    else{
        [self dismissModalViewControllerAnimated:YES];
    }            
}

Но я вижу, что у вас 4.0 в тегах вопросов.Решение, которое я нашел для <iOS 5, гораздо менее красивое, но все равно должно работать, и похоже, что вы уже на пути.Вы хотите viewDidAppear: не viewWillAppear:.Мое решение здесь включает в себя ивар, скажем:

BOOL shouldPopToRootOnAppear;

И тогда ваш GameReportModalWillBeDismissed: будет выглядеть примерно так:

-(void)GameReportModalWillBeDismissed:(BOOL)popToRoot{    
    shouldPopToRootOnAppear = popToRoot;
    [self dismissModalViewControllerAnimated:YES];          
}

А ваш viewDidAppear: будет выглядеть так...

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    if (shouldPopToRootOnAppear){
        [self.navigationController popToRootViewControllerAnimated:YES];
        return;
    }
    // Normal viewDidAppear: stuff here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...