如何实现一个UINavigationController用于模态呈现,而不是弹窗,有一个自适应segue



当使用通用故事板和自适应segue时,如何实现一个Present As Popover segue,当以模式呈现时,它只在iPhone上有一个导航栏(带有标题和关闭按钮),而当以弹出窗口呈现时,它在iPad上没有导航控制器?

我认为正确的设置是在故事板中不包括导航控制器,control-drag到新的视图控制器并选择Present As Popover segue。然后在prepareForSegue中,我们需要创建导航控制器并将目标控制器嵌入其中,然后添加标题和按钮,但前提是它将以模式呈现。如果这种方法是正确的,如何在代码中做到这一点呢?

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

在ios7及更早的版本中,你需要将导航控制器添加到故事板中然后你可以对导航控制器和它的根视图有单独的segue。然后触发正确的segue,这取决于你是否需要导航控制器(iPhone) (iPad)。

在iOS 8中,你可以使用新的UIAdaptivePresentationControllerDelegate协议,然后在你需要的地方创建一个导航控制器:

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

详细说明一下,如果你想要的是iPad上的弹窗,而iPhone上的模态表有一个关闭按钮,那么你可以这样做。

在Xcode 6.3 storyboard中,你连接一个视图控制器并将segue指定为Present as Popover

这段代码应该放在segue到弹出窗口的视图控制器中,而不是在弹出窗口本身中:

首先设置popover委托:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "myPopoverSegueName") {
        let vc = segue.destinationViewController
        vc.popoverPresentationController?.delegate = self
        return
    }
}

然后添加委托扩展并创建导航控制器/关闭按钮:

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
    }
}

然后你添加你的解散函数,你应该很好去:

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

相关内容

最新更新