无法从 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) 上成功检索到我的数据。
我尝试了委托和协议以及其他更简单的方法。最后一个日期是以下日期:
- 在 (A) 中,我只是尝试打印应该在 ViewWillAppear 中存储数据的变量:
class SearchBarsController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {
var testValue:String = ""
override func viewWillAppear(_ animated: Bool) {
print(testValue) // print is empty
super.viewWillAppear(animated)
}
}
- 在 (B) 中,我关闭弹出窗口并尝试通过单击按钮发送回数据:
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 来完成这里是示例项目:
进程:
将此方法添加到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)
}
}
我在一个 UIView (A) 和另一个 UIView (B)(嵌入在导航控制器中)之间设置了一个 "Show as popover" segue,在按钮的 clic 上激活。
我试图在关闭数据时将数据从 (B) 传回 (A)(我想在两种方式上都保留弹出动画)。
我尝试了很多方法,主要是在 Whosebug 上找到的,但到目前为止,我从未在 (A) 上成功检索到我的数据。
我尝试了委托和协议以及其他更简单的方法。最后一个日期是以下日期:
- 在 (A) 中,我只是尝试打印应该在 ViewWillAppear 中存储数据的变量:
class SearchBarsController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {
var testValue:String = ""
override func viewWillAppear(_ animated: Bool) {
print(testValue) // print is empty
super.viewWillAppear(animated)
}
}
- 在 (B) 中,我关闭弹出窗口并尝试通过单击按钮发送回数据:
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 来完成这里是示例项目:
进程:
将此方法添加到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)
}
}