UINavigationController равен нулю после всплывающего окна

Мой проект сложный (возможно, слишком сложный), но вопрос простой, вот код

...
self.vc = [[ClassName alloc] init];
if ([[self.navigationController.viewControllers lastObject] isKindOfClass:[ClassName class]]) {
    [self backAndGo:self.vc title:@"Title"];
}
else {
    [self vai:self.vc title:@"title"];
}
...

в этом коде я должен перейти непосредственно к следующему представлению, если текущее представление отличается от ClassName, в противном случае вернуться к 1 представлению и перейти к следующему.

- (void)backAndGo:(id)view title:(NSString *)title

- (void)backAndGo:(id)view title:(NSString *)title
{
    NSLog(@"before %@,%d",[self.navigationController viewControllers],[[self.navigationController viewControllers] count]);

    [self.navigationController popViewControllerAnimated:NO];

    ALCParentViewController *viewController = (ALCParentViewController *)view;
    [self.navigationController pushViewController:viewController animated:YES];

    NSLog(@"after %@,%d",[self.navigationController viewControllers],[[self.navigationController viewControllers] count]);
}

ALCParentViewController является родительским классом vc, в этом методе первый журнал контроллера навигации корректен со всем стеком контроллеров просмотра, и выполняется popViewController, но во втором журнале navigationController имеет значение null с элементом 0, очевидно, а метод pushViewController нет. казнили, почему? Любые идеи?

- (void)vai:(id)view title:(NSString *)title

- (void)vai:(id)view title:(NSString *)title
{       
    ALCParentViewController *viewController = (ALCParentViewController *)view;
    [self.navigationController pushViewController:viewController animated:YES];
}

Вместо этого это другой метод прямого доступа ко второму представлению, и он работает правильно, еще одна вещь courius (почти для меня) заключается в том, что, несмотря на нулевой pushviewcontroller, навигация (push и pop) в другом представлении работает правильно...

ИЗМЕНИТЬ 1:

Как сказал lucaslt89, я поставил точку останова во втором журнале и сделал «po self.navigationController» в консоли, вот результат

(lldb) po self.navigationController
$0 = 0x00000000 <nil>
(lldb)

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

РЕДАКТИРОВАТЬ 2:

(lldb) po self.navigationController
$0 = 0x099787d0 <UINavigationController: 0x99787d0>
(lldb) po auxNavController
$1 = 0x099787d0 <UINavigationController: 0x99787d0>
(lldb)

после операций, предложенных lucaslt89, два адреса совпадают


person Lucabro    schedule 15.07.2013    source источник
comment
Вероятно, после popViewController ваша ссылка на navigationController равна нулю. Поставьте точку останова во втором журнале и сделайте po self.navigationController в консоли, чтобы увидеть вывод и опубликовать его здесь!   -  person lucaslt89    schedule 15.07.2013


Ответы (3)


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

- (void)backAndGo:(id)view title:(NSString *)title
{
    NSLog(@"before %@,%d",[self.navigationController viewControllers],[[self.navigationController viewControllers] count]);

    UINavigationController *auxNavController = self.navigationController;

    [self.navigationController popViewControllerAnimated:NO];

    ALCParentViewController *viewController = (ALCParentViewController *)view;
    [auxNavController pushViewController:viewController animated:YES];

    NSLog(@"after %@,%d",[auxNavController viewControllers],[[auxNavController viewControllers] count]);
}

Если вы отлаживаете это, адрес self.navigationController до всплывающего окна должен быть таким же, как и auxNavController после всплывающего окна. Попробуйте это и расскажите нам о своих результатах!

person lucaslt89    schedule 15.07.2013
comment
хорошо, lucaslt89, я сделал то, что вы сказали, и частично работает, но я возвращаюсь к представлению после дома, каким бы ни было представление, где я перезваниваю AndGo ... в любом случае спасибо за помощь ;) - person Lucabro; 15.07.2013
comment
нет, извините, это работает как шарм ... но я не уверен, почему ... в любом случае вы получили чек :) - person Lucabro; 15.07.2013

Хорошо, даже когда вопрос закрыт, я хотел бы сделать пояснение для будущих посетителей. Согласно документации: . .. Это свойство равно нулю, если контроллер представления не встроен в контроллер навигации.

Это именно то, что вы делаете с инструкцией pop. Итак, в основном, прежде чем потерять ссылку на навигационный контроллер из-за всплывающего окна, обязательно сохраните ссылку на него.

person lucaslt89    schedule 18.07.2013

В вашем методе backAndGo: сначала вы выталкиваете viewController, а затем вы нажимаете другой ViewController.

Проблема в том, что после того, как вы вытащите viewController, «я» будет равно нулю. Поэтому, если вы получите навигационный контроллер с помощью «self.navigationController», он ничего не вернет.

Причина в том, что «я» равно нулю, а навигационный контроллер пуст. Вот почему ответ lucastl89 эффективен. Он держит объект navigationController по ссылке, а не ищет его, используя «я».

person Community    schedule 04.09.2016