无法从 UIView Popover Dismiss 传回数据

Can't pass datas back from UIView Popover Dismiss

我在一个 UIView (A) 和另一个 UIView (B)(嵌入在导航控制器中)之间设置了一个 "Show as popover" segue,在按钮的 clic 上激活。

我试图在关闭数据时将数据从 (B) 传回 (A)(我想在两种方式上都保留弹出动画)。

我尝试了很多方法,主要是在 Whosebug 上找到的,但到目前为止,我从未在 (A) 上成功检索到我的数据。

我尝试了委托和协议以及其他更简单的方法。最后一个日期是以下日期:

class SearchBarsController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {

    var testValue:String = ""

    override func viewWillAppear(_ animated: Bool) {
    print(testValue) // print is empty
    super.viewWillAppear(animated)
    }

}
class SearchFilterViewController: UIViewController {

    @IBAction func DismissPopoverOnClic(_ sender: Any) {
            if let navController = presentingViewController as? UINavigationController {
                let presenter = navController.topViewController as! SearchBarsController
                presenter.testValue = "Test"
                print("success") //never called
            }
            self.dismiss(animated: true, completion: nil)
    }

}

在 (B) 上,我想设置一些我将在 (A) 上使用的过滤器,以在表格视图中显示搜索结果。但实际上testValue的值始终为空。

好的,您可以使用 unwind segue 来完成这里是示例项目:

sample projecct

进程:

将此方法添加到SearchBarsController下面viewWillAppear

@IBAction func unWindFromFilterViewController(_ sender: UIStoryboardSegue) {

    }

然后转到 Storyboard 并转到 SearchFilterViewController,然后 cntrl + 从 DismissPopoverOnClic 拖动到退出按钮的顶部,然后 select unWindFromFilterViewController 。

比这个SearchFilterViewController写这个传递数据的方法

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destVC = segue.destination as? ViewController {
           destVC.testValue = "Test"

        }
    }

您将取回您想要的数据。谢谢

将数据传回 viewController 时,最有效的实现方式是 delegate

protocol SearchFilterViewControllerDelegate {
    func setTextValue(string : String)
}

class SearchFilterViewController: UIViewController {

    var delegate : SearchFilterViewControllerDelegate?


    @IBAction func DismissPopoverOnClic(_ sender: Any) {
        self.dismiss(animated: true, completion: nil)
        delegate?.setTextValue(string : "Test Value")
    }
}

class SearchBarsController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {

    var filterViewController : SearchFilterViewController? 
    func popup() {
        // your pop up code and init filterViewController
        filterViewController.delegate = self **//without this line, the delegate will be nil, no nothing will happen.**
    }
}

extension SearchBarsController : SearchFilterViewControllerDelegate {
    func setTextValue(string : String) {
        print(string)
    }
}