Как настроить навигационный контроллер с помощью UINavigationController? - PullRequest
2 голосов
/ 25 февраля 2011

Я работаю с push-уведомлениями.я пытаюсь создать и нажать DetailView в navigationController при нажатии кнопки действия в уведомлении.но навигационный контроллер - ноль.Как я могу поместить этот DetailView в NavigationController?Я хочу вставить RootViewController в навигационный контроллер, а затем DetailView.как я могу это сделать?

в AppDelegate :

  - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
            RootViewController *controller = [[RootViewController alloc] init];
//getting warnings here.(Unused variable navigationController)  
     UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:controller];
    [controller doStuff];
    [controller release];
 }

в RootViewController :

  -(void)doStuff{ 
        [[self stories] removeAllObjects];
    [self startParsing];
    [self.tableView reloadData];
    DetailViewController *detail = [[DetailViewController alloc] init];
    //custom code
   [self.navigationController pushViewController:detail animated:YES];
[detail release];

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

 [self.tableView reloadData];

Ответы [ 3 ]

5 голосов
/ 25 февраля 2011

Хорошо, теперь я почти уверен, что понимаю проблему.Проблема в том, что вы никогда не устанавливаете свойство 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];

Ключевая вещьзаключается в следующем: вам нужно поместить контроллер корневого представления в контроллер навигации, прежде чем вы сможете получить доступ к контроллеру навигации из корневого контроллера представления.

0 голосов
/ 25 февраля 2011

Если ваш навигационный контроллер равен нулю, его нужно создать, а затем вы помещаете в него вещи. Попробуйте это:

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
[navController pushViewController:detailViewController animated:NO]; // or YES
0 голосов
/ 25 февраля 2011

Если вы начинаете без UINavigationController и хотите отобразить его с более чем одним контроллером представления в его стеке, после запуска контроллера навигации вы можете установить свойство viewControllers для массива с различными желаемыми контроллерами представления.

изменить: пример кода:

UINavigationController *navController = [[UINavigationController alloc] init];
NSArray *viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
[navController setViewControllers:viewControllers animated:NO];

После этого ваш навигационный контроллер будет иметь viewController2 сверху и viewController1 позади него.

Альтернативно, вы можете сделать это следующим образом:

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController1];
[navController pushViewController:viewController2 animated:NO];
...