如何显示UINavigationController的RootViewController上的button?

这是我的代码。 我想在开始的rootviewController上放一个后退button。

- (void)selectSurah:(id)sender { SurahTableViewController * surahTableViewController = [[SurahTableViewController alloc] initWithNibName:@"SurahTableViewController" bundle:nil]; surahTableViewController.navigationItem.title=@"Surah"; surahTableViewController.navigationItem.backBarButtonItem.title=@"Back"; UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:surahTableViewController]; [self presentModalViewController:aNavigationController animated:YES]; } 

我不相信有可能将根视图控制器从导航堆栈中popup,但是可以使用作为UIBarButtonItem的自定义视图添加的UIButton来伪装它:

 UIButton *b = [[UIButton alloc]initWithButtonType:UIButtonTypeCustom]; [b setImage:[UIImage imageNamed:@"BackImage.png"] forState:UIControlStateNormal]; [b addTarget:self action:@selector(back:) forControlEvents:UIControlEventTouchUpInside]; self.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:b]; 

iOS UI元素的一个合适的PSD可以在这里find。

Faizan,

氦3评论是有道理的。

我想你的button是需要解雇模式提交的控制器,这是真的吗? 纠正,如果我错了。

如果是这样,你可以创build一个新的UIBarButtonItem ,set是一个UINavigationController navigationItem的左(或右)button。 为了不破坏封装,请在您的SurahTableViewController控制器的viewDidLoad方法中创build它。

 - (void)viewDidLoad { [super viewDidLoad]; // make attention to memory leak if you don't use ARC!!! self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStyleBordered target:self action:@selector(close:)]; } -(void)close:(id)sender { // to dismiss use dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion // dismissModalViewControllerAnimated: is deprecated [self dismissViewControllerAnimated:YES completion:^{ NSLog(@"controller dismissed"); }]; } 

由于SurahTableViewController是导航控制器中的根视图控制器,因此您无法返回到根目录。 由于您已经从其他模式中进行了呈现,因此您需要在导航栏上放置一个具有IBAction的button,该button将调用:

 [self dismissModalViewControllerAnimated:YES]; 

UINavigationController中后退button的外观和行为依赖于一堆UINavigationController之间的交互。 在第一个控制器上放置一个后退button违反了这个约定,没有什么可以返回的,这就是为什么你的代码不工作。

您需要手动添加UIBarButtonItem到标题栏代码,如:

 self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(back:)]; 

如果你真的希望它看起来像一个后退button,你需要手动创build一个镜像后退button的图像的UIBarButtonItem。

另一个build议,因为它看起来像你试图使用后退button来解散一个模式的视图控制器,我会坚持一些更传统的像“closures”或“完成”buttonclosures模式视图控制器。 后退button对于导航一堆UINavigationControllers来说确实更合适。