如何推送根视图控制器?

时间:2011-08-02 12:46:07

标签: iphone

我想推根视图控制器。为什么这段代码不起作用?

RootController *rootController = [[RootController alloc]initWithStyle:UITableViewStylePlain];               
[self.navigationController pushViewController:rootController animated:YES];
[rootController release];

之前我使用过addSubview。

- (void)cancel {
    [self.navigationController popViewControllerAnimated:YES];
}

- (void)viewDidLoad { // this is root view controller
    [super viewDidLoad];

    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancel)];
    self.navigationItem.leftBarButtonItem = cancelButton;
    [cancelButton release];     
}

RootController *rootController = [[RootController alloc]initWithStyle:UITableViewStylePlain];               
UINavigationController *aNavigationController = [[UINavigationController alloc]initWithRootViewController:rootController];
self.naviController = aNavigationController;
[aNavigationController release];
[rootController release];
[self.view addSubview:[naviController view]];

我在导航栏中添加了取消按钮以返回上一个视图。它不起作用。 所以,我想推动而不是添加。

1 个答案:

答案 0 :(得分:1)

使用

在UINavigationController中设置根控制器
initWithRootViewController:

方法。所以,你的方式是正确的。我建议您检查self.view并确保它不是nil

编辑:发表评论后

您需要为UINavigationController定义一个根视图控制器才能正常工作;来自UINavigationController reference

  

每个导航堆栈必须至少有一个视图控制器才能充当根。

因此您无法删除根视图控制器。可能,为了让事情按照您的喜好工作,你应该创建一个额外的视图控制器,用作你不会改变的根视图控制器,然后将RootViewController推送到导航堆栈,然后弹出就可以了:

UIViewController *baseController = [[UIViewController alloc] initWithStyle:UITableViewStylePlain];               
UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:baseController];
self.naviController = aNavigationController;
[aNavigationController release];
[baseController release];
[self.view addSubview:[naviController view]];

RootController *rootController = [[RootController alloc] initWithStyle:UITableViewStylePlain];               
[self.navigationController pushViewController:rootController animated:YES];
[rootController release];

请注意,我首先将一个简单的UIViewController定义为根视图控制器,然后将控制器推送到它。

一旦你这样做,如果像你一样添加取消按钮,它将从导航堆栈中弹出rootViewController。

最后评论后:

如果我理解你,当点击取消按钮时,你想要完全摆脱UINavigationController。

在这种情况下,请使用以下代码cancel

- (void)cancel {
   [self.navigationController.view removeFromSuperview];
}

如果这个猜测是正确的,请记住,由于您没有保留对导航控制器的任何引用,因此将取消分配它并使用它实例化的所有视图控制器。

如果不是完全删除UINavigationController,你会简单地隐藏导航栏,然后在弹出rootController后,调用:

setNavigationBarHidden:animated