没有以编程方式检测Dismiss Popover

时间:2016-09-23 18:36:52

标签: ios swift uipopovercontroller uipopover

我以编程方式解雇了一个popover视图控制器。如何在我的第一个视图控制器中检测到它?有没有办法将值从popover发送到第一个? 注意:popoverPresentationControllerDidDismissPopover在以编程方式解散时不起作用。 任何命题?

这是我在主视图控制器中的代码:

    let addFriendsPopoverViewController = storyboard?.instantiateViewControllerWithIdentifier("HomeEmotionPopOver") as! EmotionPopOverViewController
    addFriendsPopoverViewController.modalInPopover = true
    addFriendsPopoverViewController.modalPresentationStyle =   UIModalPresentationStyle.Popover
    addFriendsPopoverViewController.preferredContentSize = CGSizeMake(100, 100)
    let popoverMenuViewController = addFriendsPopoverViewController.popoverPresentationController
    popoverMenuViewController!.permittedArrowDirections = .Any
    popoverMenuViewController!.delegate = self
    popoverMenuViewController!.sourceView = self.view
    let height = (self.tableView.rowHeight - HeartAttributes.heartSize / 2.0 - 10) + (self.tableView.rowHeight * CGFloat((sender.view?.tag)!)) - 50
    popoverMenuViewController!.sourceRect = CGRect(
        x: 30,
        y: height,
        width: 1,
        height: 1)
    presentViewController(
        addFriendsPopoverViewController,
        animated: true,
        completion: nil)   

在popover视图控制器中,我从按钮IBAction中解除它:

     @IBAction func dismissPop(sender: AnyObject) {
    self.dismissViewControllerAnimated(true, completion: nil)

}

2 个答案:

答案 0 :(得分:1)

你提出问题的方法是你在主视图控制器上寻找一个在弹出窗口被解除时调用的函数。

这在技术上发生在viewDidAppear(animated:)。但是,它不是一个完整的证明解决方案。如果您的弹出窗口不能覆盖整个屏幕上下文,则此功能不会触发,因此这是一个不可靠的解决方案。

你真正想要的是从弹出窗口中调用一个函数来警告主视图控制器它已经完成/解除了。这可以通过委托协议轻松完成

protocol PopoverDelegate {
    func popoverDismissed()
}

class PopoverViewController {
    weak var delegate: PopoverDelegate?

    //Your Popover View Controller Code
}

将协议一致性添加到主视图控制器

class MainViewController: UIViewController, PopoverDelegate {
     //Main View Controller code
}

然后你需要设置委托以使popover成为主视图控制器。

let addFriendsPopoverViewController = storyboard?.instantiateViewControllerWithIdentifier("HomeEmotionPopOver") as! EmotionPopOverViewController
addFriendsPopoverViewController.delegate = self
//The rest of your code

最后,当你解雇时,从你的弹出视图控制器调用这个委托函数。

@IBAction func dismissPop(sender: AnyObject) {
     dismissViewControllerAnimated(true, completion: nil)
     delegate?.popoverDismissed()
}

在主视图控制器中,实现委托方法

func popoverDismissed() {
    //Any code to run when popover is dismissed
}

答案 1 :(得分:1)

诀窍是自己解雇segue,但似乎用户启动了它,以便委托方法popoverPresentationControllerDidDismissPopover()可以检测到它。

我是通过向presentViewController dismiss()函数添加一个完成闭包并直接调用例程来实现的。

if let pvc = self.presentingViewController {
    var didDismiss : ((UIPopoverPresentationController) -> Void)? = nil
    if let delegate = popoverPresentationController?.delegate {
        // check it is okay to dismiss the popover
        let okayToDismiss = delegate.popoverPresentationControllerShouldDismissPopover?(popoverPresentationController!) ?? true
        if okayToDismiss {
            // create completion closure
            didDismiss = delegate.popoverPresentationControllerDidDismissPopover
        }
    }
    // use local var to avoid memory leaks
    let ppc = popoverPresentationController
    // dismiss popover with completion closure
    pvc.dismiss(animated: true) {
        didDismiss?(ppc!)
    }
}

这对我来说很好。