首页 > 解决方案 > Swift 委托协议未调用

问题描述

我是 Swift 的初学者。我正在尝试使用委托和协议将数据从子视图向后发送到根视图(在导航控制器中)

这是我的代码:

//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)
    }
}

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

//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
    }
}

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

我错过了什么吗?

标签: swiftdelegatesprotocols

解决方案


您显示的代码filterTapped是问题所在。您从情节提要创建了一个新实例,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)
}

推荐阅读