模态继续,导航栏消失

我正在使用Xcode 4.6.1在Objective-C上进行编码。 我想知道当我在2个视图控制器之间创build一个模态时,我怎样才能保持显示的导航条,因为我在故事板中做了segue,当我运行应用程序时,第二个视图控制器的导航栏消失了,我在栏上有一个完成的button,但是我看不到它。

模态段将占据整个屏幕,因此呈现控制器中的任何导航栏,工具栏或选项卡都将被遮盖。 如果你想在这个模式控制器上有一个导航栏,你需要添加一个专门的导航栏,并添加你想要的新的导航栏(或工具栏)的button。 如果你不想这样做,那么不要模式地展示它,推动它。

只需将另一个Navigation Controller添加到您的模式视图控制器。 按照步骤

  1. selectModal View Controller
  2. 转到Editor menu
  3. selectEmbed In
  4. selectNavigation Controller

运行应用程序。 现在它应该完美地工作。

希望这可以解决你的问题。

在iOS 8中有一个更好的方法。 您可以使用自适应表示样式:

  1. 使用“现在作为popover”继续
  2. 设置你的控制器采用UIPopoverPresentationControllerDelegate协议
  3. 实施2种方法

Objective-C的:

 - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { return UIModalPresentationFullScreen; } - (UIViewController *)presentationController:(UIPresentationController *)controller viewControllerForAdaptivePresentationStyle:(UIModalPresentationStyle)style { UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController: controller.presentedViewController]; return navController; } 

迅速:

 UIPopoverPresentationControllerDelegate func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle { return UIModalPresentationStyle.FullScreen } func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? { var navController = UINavigationController(rootViewController: controller.presentedViewController) return navController } 

Swift 4:

 extension MyViewController: UIPopoverPresentationControllerDelegate { func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle { return UIModalPresentationStyle.fullScreen } func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? { return UINavigationController(rootViewController: controller.presentedViewController) } } 

在准备segue方法中设置委托:

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { if let adpostVC = segue.destinationViewController as? XXXController { let popPC = adpostVC.popoverPresentationController popPC?.delegate = self 

有一个更简单的方法来做到这一点。 像以前的评论说的(但没有解释所有的步骤),你需要将你想要的目标视图控制器embedded到导航控制器中,然后将目标视图控制器设置为导航控制器,然后导航控制器调用目标视图控制器。

首先,将VCembedded到NavVC中。 然后你必须编写代码来将segue目标设置为Nav VC。

代码如下所示:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { UINavigationController *nav = segue.destinationViewController; AddTriviaVC *triv = [[AddTriviaVC alloc]init]; triv = nav.viewControllers[0]; triv.location = self.location; } 

我希望这是有道理的。

迅捷版:

按照步骤:

  1. 将VCembedded到NavigationController中
  2. 重写prepareForSegue()

     override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "goToYourController" { let navigation: UINavigationController = segue.destinationViewController as! UINavigationController var vc = YourViewController.init() vc = navigation.viewControllers[0] as! YourViewController //if you need send something to destnation View Controller //vc.delegate = self } } 

您可以简单地执行以下操作来显示导航栏:

Objective-C的

 UINavigationController alloc]initWithRootViewController:modalVC]; 

SWIFT 3

 let modelVC = self.storyboard?.instantiateViewController(withIdentifier: "modalVC") as! ModalVC let navBarOnModal: UINavigationController = UINavigationController(rootViewController: modalVC) self.present(navBarOnModal, animated: true, completion: nil) 

这将显示导航栏的模态视图控制器。 关于Objective-C的知识是有限的,所以我没有写出呈现的部分。 你应该能够找出一个。 ;)

希望这可以帮助!

这可能是因为你的模态中没有UINavigationController 。 你应该使用一个(或只是添加一个导航栏到你的ViewController在故事板),并以模态的方式呈现。

您可以通过在-(void)viewDidLoad执行以下操作来以编程方式添加工具栏

 NSInteger tbHeight = 50; tb = [[UIToolbar alloc] initWithFrame:CGRectMake(0, (self.view.frame.size.height - tbHeight), self.view.frame.size.width, tbHeight)]; tb.translucent = YES; emailButton = [[UIBarButtonItem alloc] initWithTitle:@"Email Results" style:UIBarButtonItemStyleBordered target:tvController action:@selector(actionSheet:)]; UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(doneButtonPressed:)]; NSArray *barButton = [[NSArray alloc] initWithObjects:emailButton,flexibleSpace,doneButton,nil]; [tb setItems:barButton]; [self.view addSubview:tb]; barButton = nil; 

然后你将不得不创build一个IBAction来按下完成button,它是这样完成的:

 -(IBAction)doneButtonPressed:(id)sender { [self dismissModalViewControllerAnimated:YES]; } 

这应该给你你想要的模式视图控制器。