ios - 未以编程方式检测 Dismiss Popover

标签 ios swift uipopovercontroller uipopover

我正在以编程方式关闭弹出 View Controller 。我如何在我的第一个 View Controller 中检测到它?有没有办法将值从弹出窗口发送到第一个? 注意:popoverPresentationControllerDidDismissPopover 在以编程方式关闭时不起作用。 有什么提议吗?

这是我在主视图 Controller 中的代码:

    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 View Controller 中,我从一个按钮 IBAction 中取消它:

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

}

最佳答案

你表达问题的方式是你正在主视图 Controller 上寻找一个函数,当弹出窗口被关闭时调用该函数。

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

你真正想要的是从弹出窗口调用一个函数,提醒主视图 Controller 它已经完成/关闭。这很容易通过委托(delegate)协议(protocol)完成

protocol PopoverDelegate {
    func popoverDismissed()
}

class PopoverViewController {
    weak var delegate: PopoverDelegate?

    //Your Popover View Controller Code
}

将协议(protocol)一致性添加到您的主视图 Controller

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

然后您需要将委托(delegate)设置为使弹出窗口成为主视图 Controller 。

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

最后,当您关闭时,从您的弹出 View Controller 调用此委托(delegate)函数。

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

在你的主视图 Controller 中,实现委托(delegate)方法

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

关于ios - 未以编程方式检测 Dismiss Popover,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39667488/

相关文章:

ios - UITableView 使用 NSFetchedResultsController 和 CoreData 意外反弹到 beginUpdates()/endUpdates()/performBatchUpdates()

ios - 从 Firebase 完成加载后如何使 UIRefreshControl 结束刷新

ios - 我可以使用 Xcode 9 打开使用 Xcode 11 创建的项目吗?

iphone - 我的 UIViewController 是否可以检测它是否显示在 UIPopoverController 中?

ipad - 显示键盘 + iPad 时 UIPopoverView 变得扭曲

ios - 选中后,可以在UITableViewCell上设置高度变化的动画吗?

ios - 我们可以在 iOS 上使用 UIWebView 打开 pdf 文件吗?

iOS 13.2 MKTileOverlay 偶尔不会渲染

json - 使用 Alamofire/SwiftyJSON 获取 JSON 数组的第一个元素

iphone - 从 contentViewController 中消除 UIPopOverController