Как ссылаться на функцию обратного вызова в Swift iOS? - PullRequest
0 голосов
/ 08 февраля 2019

Что мне нужно?

Мне нужно вызвать функцию из класса, чтобы закрыть UIView другого класса, когда происходит событие.У меня есть UIViewController с UITableView и другим классом для управления ячейками этого TableView.

Моя проблема, когда я пытаюсь ссылаться на функцию обратного вызова внутри cellForRowAt: Cannot assign value of type '()' to type '(() -> ())?'.Я хочу вызвать этот обратный вызов для метода viewDidDisappear.

Код

class ViewControllerRelatorios : UIViewController, UITableViewDataSource, UITableViewDelegate {

    var closeCellPopup : (()->())? // Ref

    @IBOutlet weak var tableViewContent: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableViewContent.dataSource       = self
        self.tableViewContent.delegate         = self
    }

    override func viewDidDisappear(_ animated: Bool) {
        if closeCellPopup != nil {
            closeCellPopup!() // Here OK
        }
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let cell2 = tableView.dequeueReusableCell(withIdentifier: "cellDailyReport") as! CellDailyReport
       self.closeCellPopup = cell2.closePopup // Error: Cannot assign value of type '()' to type '(() -> ())?'
       return cell2
    }
}

class CellDailyReport : UITableViewCell {

    var lastView = UIView()

    var closePopup : () {
        self.lastView.removeFromSuperview()
    }
}

Если я изменю объявление var closeCellPopup : (()->())? на var closeCellPopup : ()?, я не смогувызвать эту функцию.

   override func viewDidDisappear(_ animated: Bool) {
        if closeCellPopup != nil {
            closeCellPopup!() // Cannot call value of non-function type '()'
        }
    }

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Даже если ваша переменная замыкания имеет правильный тип, ваш код все равно просто установит ссылку на последнюю удаленную ячейку.

Если я правильно понимаю, вам нужно удалить все lastView из его суперпредставления после того, как контроллер представления действительно исчез, так что вы можете просто перебирать ячейки с понижением в представлении таблицы

override func viewDidDisappear(_ animated: Bool) {
    let cells = tableViewContent.visibleCells as! [CellDailyReport]
    cells.forEach { $0.lastView.removeFromSuperView() }
}
0 голосов
/ 08 февраля 2019

Есть лучший способ сделать это, но вы можете исправить свои ошибки, сделав его функцией.

class CellDailyReport : UITableViewCell {

    var lastView = UIView()

    func closePopup() {
        self.lastView.removeFromSuperview()
    }
}
...