在其他地方点击时,关闭popover viewController

时间:2017-01-12 14:40:50

标签: ios swift uitableview uipopovercontroller

我在UITableView上展示了一个popover viewController。如果在它外面敲击它怎么能解雇这个popover?我尝试从didSelectRow方法调用它,但没有检测到水龙头。有什么建议吗? 谢谢! 这是我的代码:

    let addFriendsPopoverViewController = storyboard?.instantiateViewController(withIdentifier: "HomePopOver") as! HomePopOverViewController
    addFriendsPopoverViewController.index = (sender.tag)!
    addFriendsPopoverViewController.delegate = self
    addFriendsPopoverViewController.isModalInPopover = true
    addFriendsPopoverViewController.modalPresentationStyle =   UIModalPresentationStyle.popover
    addFriendsPopoverViewController.preferredContentSize = CGSize(width: 210, height: 40)
    let popoverMenuViewController = addFriendsPopoverViewController.popoverPresentationController
    popoverMenuViewController!.permittedArrowDirections = .down
    popoverMenuViewController!.delegate = self
    popoverMenuViewController!.sourceView = self.view
    popoverMenuViewController!.sourceRect = CGRect(
        x: UIScreen.main.bounds.width  - 105,
        y: 50,
        width: 1,
        height: 1)
    present(
        addFriendsPopoverViewController,
        animated: true,
        completion: nil)

2 个答案:

答案 0 :(得分:1)

使用UIPopoverController呈现的视图控制器或使用UIModalPresentationPopover呈现的视图控制器将在用户点击弹出框之外时自动被解除,除非您已设置isModalInPopover或实施了委托方法这阻止了它。

如果在发生这种情况时需要运行某些代码,那么您还需要实现委托方法。

哪些具体方法取决于您使用的是UIPopoverController还是UIModalPresentationPopover。您问题上的标签表明前者,但这是一种过时的(并且已弃用)方式。

答案 1 :(得分:1)

即使您找到了答案,我也想分享我的解决方案,因为我遇到了同样的问题,花了一些时间弄清楚了之后,我才发现了问题所在。这实际上不是因为缺少了某些东西,而是因为徒然实现了一些东西。

尽管我不知道为什么会发生这种情况,但是如果您的代码中实施了以下方法,则可能会通过点击UIBarButtonItem本身以外的任何地方来关闭弹出窗口。

    func prepareForPopoverPresentation(_ popoverPresentationController: UIPopoverPresentationController) {
        popoverPresentationController.permittedArrowDirections = .any
        popoverPresentationController.barButtonItem = UIBarButtonItem(customView: categoryButton)
    }

这是我为弹出窗口所做的其余实现:

extension SearchViewController:UIPopoverPresentationControllerDelegate {

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
    return .none
}

func presentPopover(sender: UIButton) {
    let popoverContentController = PopoverCategoryViewController()
    let nav = UINavigationController(rootViewController: popoverContentController)
    nav.modalPresentationStyle = UIModalPresentationStyle.popover
    nav.isNavigationBarHidden = true
    let popover = nav.popoverPresentationController
    popover?.backgroundColor = ChaptifyColor.backgroundGray
    popover?.delegate = self
    popover?.sourceView = sender
    popover?.sourceRect = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: sender.bounds.width, height: sender.bounds.height))
    popoverContentController.preferredContentSize = CGSize(width: 300, height: 300)
    self.present(nav, animated: true, completion: nil)
}
}