如何在Swift iOS上引用回调函数?

问题描述 投票:0回答:2

我需要的?

当事件发生时,我需要从类中调用一个函数来关闭另一个类的UIView。我有一个UIViewControllerUITableView和另一个类来管理TableView的单元格。

我的问题是当我尝试在cellForRowAtCannot 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 '()'
        }
    }
ios swift callback closures
2个回答
1
投票

有一种更好的方法可以做到这一点,但你可以通过使它成为一个函数来修复你的错误。

class CellDailyReport : UITableViewCell {

    var lastView = UIView()

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

1
投票

即使您的闭包变量具有正确的类型,您的代码仍然只会设置最后出列单元格的引用。

如果我理解正确,你需要在视图控制器消失之后从其超级视图中删除每个lastView,这样你就可以遍历表视图的下采样单元格

override func viewDidDisappear(_ animated: Bool) {
    let cells = tableViewContent.visibleCells as! [CellDailyReport]
    cells.forEach { $0.lastView.removeFromSuperView() }
}
© www.soinside.com 2019 - 2024. All rights reserved.