Хорошо, теперь я почти уверен, что понимаю проблему.Проблема в том, что вы никогда не устанавливаете свойство navigationController вручную в UIViewController.Свойство navigationController равно nil, если контроллер представления не находится под контроллером навигации, и если это так, то свойство указывает на него.
Что вам нужно сделать, это когда вы отображаете свой корневой контроллер представления вместонепосредственно отображая его вид, добавьте его в контроллер навигации, затем отобразите вид контроллера навигации.Примерно так:
RootViewController *controller = [[RootViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:controller];
//Here you would display navigationController.view somehow
Итак, после того, как у вас есть контроллер корневого представления в контроллере навигации, в методе в контроллере корневого представления вы можете сделать это:
DetailViewController *detail = [[DetailViewController alloc] init];
//Do whatever you need to do to set values on the detail view controller
[self.navigationController pushViewController:detail animated:YES];
Ключевая вещьзаключается в следующем: вам нужно поместить контроллер корневого представления в контроллер навигации, прежде чем вы сможете получить доступ к контроллеру навигации из корневого контроллера представления.