模态segue,导航栏消失

时间:2013-03-28 18:14:49

标签: ios objective-c xcode4.6

我正在使用Xcode 4.6.1在Objective-C上进行编码。我想知道当我在2个View控制器之间创建模态segue时如何保持导航栏显示,因为我在故事板中执行segue,当我运行应用程序时,第二个视图控制器的导航栏消失了,我在那个酒吧上有一个完成按钮,但我看不到它。

11 个答案:

答案 0 :(得分:81)

只需将另一个Navigation Controller添加到模态视图控制器即可。按照步骤

  1. 选择Modal View Controller
  2. 转到Editor menu
  3. 选择Embed In
  4. 选择Navigation Controller
  5. 运行该应用程序。现在它应该完美地工作。

    希望这能解决你的问题。

答案 1 :(得分:57)

模态segue占据整个屏幕,因此呈现控制器中的任何导航栏,工具栏或标签栏都将被掩盖。如果您想在此模态控制器上使用导航栏,则需要专门为其添加一个导航栏,并将所需的任何按钮添加到该新导航栏(或工具栏)。如果您不想这样做,那么不要以模态方式呈现它,请按下它。

答案 2 :(得分:14)

您只需执行以下操作即可显示导航栏:

<强>目标C

v-if="product.gender == gender" 

SWIFT 3

UINavigationController alloc]initWithRootViewController:modalVC];

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

希望这有帮助!

答案 3 :(得分:10)

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

  1. 使用“作为弹出窗口显示”segue
  2. 将您的控制器设置为采用UIPopoverPresentationControllerDelegate协议
  3. 实施2个方法
  4. 目标-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
    }
    
    斯威夫特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
    

答案 4 :(得分:5)

swift版本:

按照步骤:

  1. 在NavigationController中嵌入VC
  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
      }
    }
    

答案 5 :(得分:4)

有一种更简单的方法可以做到这一点。像之前的评论说的那样(但没有解释所有步骤)您需要在导航控制器中嵌入您想要的目标视图控制器,然后将目标视图控制器设置为导航控制器,然后导航控制器调用目标视图控制器。

首先,将VC嵌入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; 
} 

我希望这是有道理的。

答案 6 :(得分:1)

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

答案 7 :(得分:1)

在故事板中,您应该在新的viewController中添加导航项,然后为完成的按钮添加条形按钮项

答案 8 :(得分:0)

您可以通过在-(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;

然后您必须创建一个IBAction来按下完成按钮,它就像这样完成:

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

这应该可以为您提供模态视图控制器所需的功能。

答案 9 :(得分:0)

这是我在Swift 4.2中“ Volodymyr Nazarkevych”的简写版本

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)
    switch(segue.identifier ?? "") {

    case "segueIdentifier": // name of your segue
        let navigation: UINavigationController = segue.destination as! UINavigationController

        //here you create new name of your destination ViewController and assign his name to let constant above
        guard let myNewViewController = navigation.viewControllers[0] as? DestinationViewController
       //DestinationViewController is your 2-ViewController where you go to from first one.

       else {
            fatalError("Unexpected destination: \(segue.destination)")
        }
       // TO DO SOMETHING HERE

   default:
        fatalError("Unexpected Segue Identifier; \(String(describing: segue.identifier))")
    }
}

“ Volodymyr Nazarkevych”的代码可以完美地工作,但是仅当您的选择是从1-ViewController到2-ViewController的NavigationController而不是直接到2-ViewController时。谢谢!!

在目标块代码之后的切换情况下,您也可以做其他事情,例如从第二个ViewController获取一些信息或文件。

答案 10 :(得分:0)

为了在模式视图控制器上显示导航栏,一种方法是插入导航控制器。您可以将此导航器的segue设置为“模态显示”,并且可以根据需要将演示文稿设置为“全屏”。

这是在Interface Builder中的外观,请注意,既然我们已插入导航控制器作为segue的目标,则“ Title”和“ Item”按钮将显示。

enter image description here