我在我的MainViewController
内创建了一个弹出窗口,当使用UIPopoverPresentationController
触摸了一些按钮时,设置像它在2014年WWDC中显示的委托,方式如下:
MainViewController.swift
class MainViewController : UIViewController, UIPopoverPresentationControllerDelegate {
@IBAction func showPopover(sender: AnyObject) {
var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("PopOverViewController") as UIViewController
popoverContent.modalPresentationStyle = UIModalPresentationStyle.Popover
var popover = popoverContent.popoverPresentationController
popoverContent.preferredContentSize = CGSizeMake(250, 419)
popover!.delegate = self
popover!.sourceView = self.view
popover!.sourceRect = CGRectMake(180,85,0,0)
self.presentViewController(popoverContent, animated: true, completion: nil)
}
}
popover里面有一个View,当用Tap Gesture Recognizer点击View时我使用模态segue显示LastViewController
,模态segue是通过Interface Builder创建的,而不是使用动作来创建提出另一个LastViewController
一旦LastViewController
被解雇,我回到MainViewController
,弹出窗口仍然打开。
在 PopOverController 中,我只有默认代码。
LastViewController.swift
@IBAction func dismissVIew(sender: AnyObject) {
self.dismissViewControllerAnimated(true, completion: nil)
}
上面的代码用于在触摸内部按钮时解除LastViewController
。
故事板
如果另一个LastViewController
可见,或者在打开另一个LastViewController
之前,我该如何解除该问题?
提前致谢
答案 0 :(得分:18)
我已经在here 上回答了同样的问题 场景不同但解决方案相同
您必须在完成当前视图控制器时编写用于关闭呈现视图控制器的代码。
在LastViewController.swift
var tmpController :UIViewController! = self.presentingViewController;
self.dismissViewControllerAnimated(false, completion: {()->Void in
println("done");
tmpController.dismissViewControllerAnimated(false, completion: nil);
});
下载link
答案 1 :(得分:6)
在FinalViewController上的按钮操作中,您尝试过:
@IBAction func dismissMe() {
//this should tell the popover to tell the main view controller to dismiss it.
self.presentingViewController!.presentingViewController!.dismissViewControllerAnimated(false, completion: nil)
}
答案 2 :(得分:1)
这是我将如何做到的。
我通常使用PopoverViewController的懒惰初始化和它的ContentViewController
lazy var popoverVC: UIPopoverController = {
let vc = UIPopoverController(contentViewController: self.contentVC)
vc.delegate = self
return vc
}()
lazy var contentVC: UIViewController = {
let vc = self.storyboard?.instantiateViewControllerWithIdentifier("ContentViewController") as UIViewController
vc.modalInPopover = true
return vc
}()
在我的contentViewController中我持有对UIPopoverController的引用。
var popoverVC: UIPopoverController!
然后当我显示popover时,我只是将popoverController分配给contentViewController
@IBAction func showPopover(sender: UIButton) {
contentVC.popoverVC = self.popoverVC
let viewCenterRect = self.view.convertRect(self.view.bounds, toView: self.view)
popoverVC.presentPopoverFromRect(CGRectMake(CGRectGetMidX(viewCenterRect), CGRectGetMidY(viewCenterRect), 1, 1), inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.allZeros, animated: true)
}
最后我在@IBAction
@IBAction func dismissPopover(sender: AnyObject) {
popoverVC.dismissPopoverAnimated(true)
}
答案 3 :(得分:0)
在viewcontroller中,您可以覆盖viewWillAppear()
这个区域里面有一个dimiss it
override public func viewWillAppear(animated: Bool)
{
super.viewWillAppear(animated)
_viewToDismiss.removeFromSuperView()
}
但是上面的代码假设您有一个对PopOver对象的引用,根据您描述问题的方式,我认为这不是一个好习惯。
相反,为什么不让创建PopOver的viewcontroller负责销毁它。把它放在侦听按钮触摸的类中(我也假设它也创建了PopOver)
- (void)viewWillDisappear:(BOOL)animated
{
_popOver.removeFromSuperView()
}
答案 4 :(得分:0)
popover里面有一个View,当用Tap Gesture Recognizer点击View时,我会使用模态segue显示另一个ViewController。
据我所知,您应该能够通过与您的点按手势识别器关联的操作来调用dismissViewControllerAnimated(_:completion:)
。这将解雇你提出的popovers:
self.presentViewController(popoverContent, animated: true, completion: nil)
您可以在弹出窗口控制器本身上调用此方法,具体取决于您更方便:
呈现视图控制器负责解除它所呈现的视图控制器。如果在呈现的视图控制器本身上调用此方法,它会自动将消息转发给呈现视图控制器。
答案 5 :(得分:0)
基于@Jageen答案
let tmpController :UIViewController! = self.presentingViewController;
self.dismiss(animated: false, completion: {()->Void in
print("done");
tmpController.dismiss(animated: false, completion: nil);
});