如何显示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来说确实更合适。