在使用通用故事板和自适应segue的同时,如何实现一个Present As Popover segue,它只在iPhone上以模态方式显示导航栏(带标题和关闭按钮),并且不会有导航控制器iPad作为popover呈现?
我认为正确的设置是不在故事板中包含导航控制器,控制 - 拖动到新的视图控制器并选择当前弹出窗口。然后在prepareForSegue
中,需要创建导航控制器并在其中嵌入目标控制器,然后添加标题和按钮,但前提是它将以模态方式呈现。如果这种方法是正确的,那怎么能在代码中做到这一点?
答案 0 :(得分:3)
Rdelmar是正确的,你不能在prepareForSegue
中执行此操作,因为已经设置了目标视图控制器。
在iOS 7及更早版本中,您必须将该导航控制器添加到故事板,然后您可以将单独的segue添加到导航控制器及其根视图。然后根据您是否需要导航控制器(iPhone)(iPad)来触发右侧segue。
在iOS 8中,您可以使用新的UIAdaptivePresentationControllerDelegate
协议,然后在需要的地方动态创建导航控制器:
func presentationController(controller: UIPresentationController!, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController!
{
let presented = controller.presentedViewController
return UINavigationController(rootViewController: presented)
}
答案 1 :(得分:0)
要详细说明这一点,如果您想要的是iPad上的弹出窗口,而是iPhone上有关闭按钮的模态表,那么这就是您的操作方式。
在Xcode 6.3故事板中,您连接了一个视图控制器并将segue指定为“作为弹出窗口存在”
此代码应位于视图控制器中,该控制器将分段为popover,而不是popover本身:
首先设置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)
}