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

标签 swift delegates protocols

我是 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/

相关文章:

Python 套接字 - 创建消息格式

Swift 协议(protocol)实现 Equatable

swift - 问题将图像添加到 UISegmentedControl

ios - 如何将元数据永久保存到 UIImage?

ios - 如何将另一个 ViewController 设置为 AlertView 的委托(delegate)

c# - 如何像在 C# 中一样在 Java 中使用委托(delegate)?

ios - 按键时重新启动 UIActivityIndi​​cator

iOS |如何以编程方式打开谷歌类应用程序

ios - 为什么我的简单 swift 委托(delegate)和协议(protocol)设置不起作用?

networking - 基于帧和基于流的协议(protocol)