iPhone:用导航栏显示模态UITableViewController
我展示了一个UITableViewController
类的模态视图。 出于某种原因,它不会显示导航栏。 这是我的代码:
SettingsCreateAccount *detailViewController = [[SettingsCreateAccount alloc] initWithStyle:UITableViewStyleGrouped]; detailViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; detailViewController.navigationController.navigationBarHidden = NO; [self.navigationController presentModalViewController:detailViewController animated:YES]; detailViewController = nil; [detailViewController release];
我以为这是默认显示? 如果有帮助,我从另一个类也调用这个UITableViewController
UINavigationController
pipe理。 想法?
当您呈现模式视图控制器时,它不使用任何现有的导航控制器或导航栏。 如果您只想显示导航栏,则需要将导航栏添加为模态视图的子视图,然后按照您的要求进行显示。
如果你想呈现一个具有导航function的模式视图控制器,则需要提供一个包含你的详细视图控制器的模式导航控制器,如下所示:
SettingsCreateAccount *detailViewController = [[SettingsCreateAccount alloc] initWithStyle:UITableViewStyleGrouped]; UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:detailViewController]; [detailViewController release]; navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; [self presentModalViewController:navController animated:YES]; [navController release];
您的模式控制器将pipe理自己的导航堆栈。
这是一个显示导航栏的方法,那些使用故事板的人,由苹果的故事板上的教程build议。
由于模式视图控制器不会被添加到导航堆栈,所以它不会从表格视图控制器的导航控制器获得导航栏。 为了给视图控制器一个导航栏,当模式呈现时,将其embedded到自己的导航控制器中。
- 在大纲视图中,select“视图控制器”。
- select视图控制器后,select编辑器>embedded>导航控制器。
在iOS 7上,你只是想在你的模式视图控制器上的导航栏显示标题和一些button? 在你的UITableViewController中试试这个魔术:
// in the .h @property (strong) UINavigationBar* navigationBar; //in the .m - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.title = @"Awesome"; self.navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectZero]; [self.view addSubview:_navigationBar]; [self.navigationBar pushNavigationItem:self.navigationItem animated:NO]; } -(void)layoutNavigationBar{ self.navigationBar.frame = CGRectMake(0, self.tableView.contentOffset.y, self.tableView.frame.size.width, self.topLayoutGuide.length + 44); self.tableView.contentInset = UIEdgeInsetsMake(self.navigationBar.frame.size.height, 0, 0, 0); } -(void)scrollViewDidScroll:(UIScrollView *)scrollView{ //no need to call super [self layoutNavigationBar]; } -(void)viewDidLayoutSubviews{ [super viewDidLayoutSubviews]; [self layoutNavigationBar]; }
我想分享如何使用可接受的解决scheme与故事板的项目:
简单的方法是在虚拟展示的VC之前放置一个故事板空白导航控制器,所以关系如下所示:
(Presenter VC) – >模态地呈现 – >(导航控制器有一个控制器作为其根目录)。
我们已经尝试了一段时间的这种方法,并注意到,当每个中间导航控制器的时候,我们的故事板被大量这样的中间导航控制器“污染”了! 他们是专门用于一个! 一些其他控制器的演示文稿,我们希望通过导航栏进行模态呈现。
我们目前的解决scheme是将代码从接受的答案封装到一个自定义的segue中:
#import "ModalPresentationWithNavigationBarSegue.h" @implementation ModalPresentationWithNavigationBarSegue - (void)perform { UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:self.destinationViewController]; [self.sourceViewController presentViewController:navigationController animated:YES completion:nil]; } @end
在我们的项目中有这个segue,我们不再在我们的故事板中创build中间导航控制器,我们只是使用这个ModalPresentationWithNavigationBarSegue,如:
Presenter VC – > Presentee VC
我希望这个答案对那些喜欢避免应用程序故事板中不必要的重复的人有所帮助。
如果你只需要一个NavigationBar
,你可以添加一个UINavigationBar
的实例并为其分配BarItems。
我只是想添加一些什么@斯科特说。 他的答案绝对是现在最简单也是最受欢迎的方式,现在使用Storyboard,iOS 7和8 …(以及很快,9)。
绝对地将视图控制器添加到故事板并按照@Scott所描述的那样embedded它是正确的方法。
然后,只需通过从源视图控制器拖动到目标(您想要模态显示的目标)来添加segue,当小视图出现时select“Present Modally”,并selectSeguetypes。 也许很好给它一个名字(在下面的例子中,我使用“presentMyModalViewController”)。
我缺less的一件事就是@斯科特的情况是,当你想实际上将一些数据传递给embedded在导航控制器中的模式呈现的视图控制器。
如果你抓住了segue.destinationViewController,它将是一个UINavigationController,而不是你在UINavigationController中embedded的控制器。
因此,要查看导航控制器中的embedded式视图控制器,以下是我所做的:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"presentMyModalViewController"]) { // This could be collapsed, but it's a little easier to see // what's going on written out this way. // First get the destination view controller, which will be a UINavigationController UINavigationController *nvc = (UINavigationController *)segue.destinationViewController; // To get the view controller we're interested in, grab the navigation controller's "topViewController" property MyModalViewController *vc = (EmailReceiptViewController *)[nvc topViewController]; // Now that we have the reference to our view controller, we can set its properties here: vc.myAwesomeProperty = @"awesome!"; } }
希望这可以帮助!