我需要的?
当事件发生时,我需要从类中调用一个函数来关闭另一个类的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 '()'
}
}
有一种更好的方法可以做到这一点,但你可以通过使它成为一个函数来修复你的错误。
class CellDailyReport : UITableViewCell {
var lastView = UIView()
func closePopup() {
self.lastView.removeFromSuperview()
}
}
即使您的闭包变量具有正确的类型,您的代码仍然只会设置最后出列单元格的引用。
如果我理解正确,你需要在视图控制器消失之后从其超级视图中删除每个lastView
,这样你就可以遍历表视图的下采样单元格
override func viewDidDisappear(_ animated: Bool) {
let cells = tableViewContent.visibleCells as! [CellDailyReport]
cells.forEach { $0.lastView.removeFromSuperView() }
}