如何检测何时在iOS 9中关闭弹出窗口

问题描述 投票:10回答:3

我正在更新应用程序以使用通用情节提要。我已经使用界面构建器通过将新按钮从按钮拖到我的新的ViewController中并选择“ Present As Popover”作为弹出按钮,为新的ViewController创建了一个弹出按钮。

[当用户在弹出窗口外按下时(将其关闭),我需要在呈现视图控制器中得到通知,以便撤消其操作。我该怎么办?

通常,我会手动创建弹出窗口,并使我的viewcontroller成为弹出窗口的委托;让我可以使用popoverControllerDidDismissPopover委托回调。但是,iOS9中不推荐使用此方法,即使不是,我也不知道在哪里可以找到弹出窗口,因此可以将其委托设置为我的视图控制器。

ios ios9 uistoryboardsegue uipopover universal-storyboard
3个回答
13
投票

[不确定您所指的是哪种方法已被弃用,但您仍然可以使用UIPopoverPresentationControllerDelegate来实现。类似于:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "popoverSegue" {
        let vc = segue.destinationViewController
        sortVC.modalPresentationStyle = .Popover
        sortVC.popoverPresentationController?.sourceRect = filterButton.bounds
        sortVC.preferredContentSize = CGSizeMake(216, 150)
        sortVC.popoverPresentationController!.delegate = self
    }
}

然后使用

func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController)

处理其解雇的方法。


7
投票

popoverControllerDidDismissPopover:方法已由popoverPresentationControllerShouldDismissPopover:替代,因为UIPopoverControllerDelegate已由UIPopoverPresentationControllerDelegate替代。

从您的呈现视图控制器中,遵循新协议,并在prepareForSegue:中设置弹出窗口呈现控制器的委托:

class MyPresentingViewController: UIViewController, UIPopoverPresentationControllerDelegate {

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

    func popoverPresentationControllerShouldDismissPopover(popoverPresentationController: UIPopoverPresentationController) -> Bool {
        return true
    }
}

然后,您可以使用委托方法以以前打算的方式处理对解雇的检测。


0
投票

我发现,如果您要检测所有解雇,则最好使用在viewWillDisappear()中调用的闭包,而不是仅使用在视图外部触摸时才进行检测的委托。这样一来,您就可以将所有解雇都集中在一个地方。

class SecondViewController: UIViewController {
    var leaveAction: (() -> Void)?

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        leaveAction?()
    }
}
class FirstViewController: UIViewController {
    private var isShowingPopover = false

    // ...

    // Storyboard equivalent will work too
    @objc private func popoverTapped() {
        let vc = SecondViewController()
        isShowingPopover = true
        vc.leaveAction = { [weak self] in
            // Gets called when leaveAction?() is called in SecondViewController
            self?.isShowingPopover = false
        }
        vc.modalPresentationStyle = .popover
        vc.popoverPresentationController?.sourceRect = filterButton.bounds
        vc.preferredContentSize = CGSizeMake(216, 150)
        vc.popoverPresentationController?.delegate = self

        present(vc, animated: true)
    }
}

// MARK: - Popover delegates
extension FirstViewController: UIPopoverPresentationControllerDelegate {
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return .none
    }

    func popoverPresentationControllerShouldDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) -> Bool {
        return true
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.