gpt4 book ai didi

Swift 委托(delegate)协议(protocol)未调用

转载 作者:行者123 更新时间:2023-11-30 10:53:40 24 4
gpt4 key购买 nike

我是 Swift 的初学者。我正在尝试使用委托(delegate)和协议(protocol)将数据从 subview 向后发送到 Root View (在导航 Controller 中)

这是我的代码:

//FilterViewController.swift:

protocol FilterDelegate: class {
func finishFilter(query: String);
}

class FilterViewController:BaseViewController,....{
....
weak var delegate : FilterDelegate?

@IBAction func acceptTapped(_ sender: UIButton) {
var querystring = ""
var conditions: [String] = []
//some logic works with conditions
querystring = conditions.joined(separator: "&")
self.delegate?.finishFilter(query: querystring)
self.navigationController?.popViewController(animated: true)
}
}

这是我从过滤器调用委托(delegate)的地方

//HouseListController.swift

class HouseListController: BaseViewController,..{
var filterController = FilterViewController()

//Here is where I push the FilterViewController
@IBAction func filterTapped(_ sender: UIButton) {
self.currentMode = .filter
self.tracking.previousMode = .filter
self.filterController = storyboard?.instantiateViewController(withIdentifier: "FilterView") as! FilterViewController
self.navigationController?.pushViewController(self.filterController, animated: true)
}

override func viewDidLoad() {
self.filterController.delegate = self
}
}

extension HouseListController : FilterDelegate {
func finishFilter(query: String) {
switch self.currentMode{
case .normal:
_ = self.filterHouse(querystring: query , offset: 0, limit: self.tracking.limit).done{ dataHouses in
self.houses.filter = dataHouses
self.houses.defaultHouses = dataHouses
}.done{ _ in
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
case .search:
_ = self.filterHouse(searchKey: self.tracking.search.searchKey, querystring: query, offset: 0, limit: self.tracking.limit).done{ dataHouses in
self.houses.filter = dataHouses
self.houses.defaultHouses = dataHouses
}.done{ _ in
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
default:
_ = self.filterHouse(querystring: query , offset: 0, limit: self.tracking.limit).done{ dataHouses in
self.houses.filter = dataHouses
self.houses.defaultHouses = dataHouses
}.done{ _ in
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
self.currentMode = .filter
}
}

委托(delegate)没有调用我的 finishFilter 函数。相反,当我在 FilterController 中弹出 View 时,它会直接转到 HouseListController 中的 viewWillAppear 并停留在那里,而不调用委托(delegate)。

我错过了什么吗?

最佳答案

您在 filterTapped 中显示的代码就是问题所在。您从 Storyboard创建了一个新的 FilterViewController 实例,但从未设置该实例的 delegate 属性。

我会删除你的filterController属性。删除 viewDidLoad 中设置其delegate 的行。您从未使用过该代码,因此不需要它。

然后更新filterTapped:

@IBAction func filterTapped(_ sender: UIButton) {
self.currentMode = .filter
self.tracking.previousMode = .filter
let filterController = storyboard?.instantiateViewController(withIdentifier: "FilterView") as! FilterViewController // Update this line
filterController.delegate = self // Add this line
self.navigationController?.pushViewController(self.filterController, animated: true)
}

关于Swift 委托(delegate)协议(protocol)未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54192706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com