触摸后取消Popover

时间:2015-01-29 20:33:14

标签: swift ios8 uipopovercontroller

我在我的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

  

故事板

enter image description here

如果另一个LastViewController可见,或者在打开另一个LastViewController之前,我该如何解除该问题?

提前致谢

6 个答案:

答案 0 :(得分:18)

我已经在here 上回答了同样的问题 场景不同但解决方案相同

您必须在完成当前视图控制器时编写用于关闭呈现视图控制器的代码。
LastViewController.swift

的dismissVIew方法上写下以下代码
 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

中以编程方式解除了Popover
@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答案

雨燕4.2

let tmpController :UIViewController! = self.presentingViewController;

self.dismiss(animated: false, completion: {()->Void in
    print("done");
    tmpController.dismiss(animated: false, completion: nil);
});