Протокол Swift делегат не вызывает - PullRequest
0 голосов
/ 15 января 2019

Я новичок в 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, оно сразу переходит к viewWillAppear в HouseListController и просто застревает там без какого-либо вызова делегата.

Я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Если вы хотите отправить данные в обратном направлении, используйте замыкание. Допустим, у вас есть 2 контроллера вида A и B, и вы хотите, чтобы данные от B до A, объявляйте замыкание в контроллере вида B.

class B_ViewController: UIViewController{
   var closureData: ((NSMutableArray) -> Void) = { arg in }

    @IBAction func onBtnDoneClick(_ sender: Any) {
        self.closureData(self.selectedClosureArray)
        self.navigationController?.popViewController(animated: true)
    }
}

Теперь в представлении контроллера A завершение вызова объявляется в представлении контроллера B. Здесь A_VC_array равно NSMutableArray, а bVC - объект Viewcontroller B.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    self.bVC.closureData  = { (selectedClosureData:NSMutableArray) -> Void in
        self.A_VC_array = selectedClosureData
    }
}
0 голосов
/ 15 января 2019

Код, который вы показываете в 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)
}
...