关于ios:如何使用自适应segue实现UINavigationController用于模态表示,而不是用于弹出窗口

How to implement a UINavigationController for modal presentation, not for popover, with an adaptive segue

当使用一个通用的故事板和自适应segues时,如何能够实现一个popover segue的礼物,它只有一个导航栏(带有标题和关闭按钮)在iPhone上,当以popoover的形式出现时,它不会在iPad上有导航控制器?

我认为正确的设置是不要在故事板中包含导航控制器,控制拖动到新的视图控制器,并选择一个作为Popover Segue的礼物。然后在prepareForSegue中,需要创建导航控制器并将目标控制器嵌入其中,然后添加标题和按钮,但前提是它将以模态显示。如果这种方法是正确的,那么如何在代码中做到这一点呢?


rdelmar是正确的,您不能在prepareForSegue中这样做,因为目标视图控制器已经设置好了。

在iOS7和更早的版本中,您必须将导航控制器添加到故事板中,然后您可以将单独的段添加到导航控制器及其根视图中。然后根据您是否需要导航控制器(iPhone)或不是(iPad),触发正确的信号。

在iOS 8中,您可以使用新的UIAdaptivePresentationControllerDelegate协议,然后在需要时动态创建导航控制器:

1
2
3
4
5
func presentationController(controller: UIPresentationController!, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController!
{
  let presented = controller.presentedViewController
  return UINavigationController(rootViewController: presented)
}

稍微详细说明一下,如果你想要的是iPad上的弹出窗口,而iPhone上有一个关闭按钮的模式表,那么这就是你要做的。

在Xcode6.3故事板中,您连接了一个视图控制器,并将segue指定为"present as popoover"。

此代码应该位于与Popover分离的视图控制器中,而不是位于Popover本身中:

首先设置Popover代理:

1
2
3
4
5
6
7
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier =="myPopoverSegueName") {
        let vc = segue.destinationViewController
        vc.popoverPresentationController?.delegate = self
        return
    }
}

然后添加代理扩展并动态创建导航控制器/关闭按钮:

1
2
3
4
5
6
7
8
9
10
extension myViewController: UIPopoverPresentationControllerDelegate {

    func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
        let btnDone = UIBarButtonItem(title:"Done", style: .Done, target: self, action:"dismiss")
        let nav = UINavigationController(rootViewController: controller.presentedViewController)
        nav.topViewController.navigationItem.leftBarButtonItem = btnDone
        return nav
    }

}

然后你添加了你的解雇功能,你应该很好的去:

1
2
3
func dismiss() {
    self.dismissViewControllerAnimated(true, completion: nil)
}