moo*_*der 2 delegates protocols uitableview ios swift
我有 ViewController (MainVC) 和充满自定义单元格的 TableView。他们已启用或禁用星号。
当用户点击单元格时,他导航到单独的 ViewController (DetailedVC)。那里有一个按钮,可以切换对象的特色状态。我想在这种情况下使用委托模式 - 因此当用户返回 MainVC 对象时,特征状态也会更新。
我创建了协议
protocol FeaturedDelegate {
func toggleFeatured (cell : CustomCell)
}
Run Code Online (Sandbox Code Playgroud)
使 MainVC 符合它
class MainVC : UIViewController, UITableViewDelegate, UITableViewDataSource, FeaturedDelegate {
func toggleFeatured (cell : CustomCell) {
//toggle featured status for cell
}
}
......
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: CustomCell = ...
cell.featuredDelegate = self
return cell
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,委托位于单元格内。但是我需要在DetailedVC 中。我接下来该怎么做?
在 DetailVC 中创建一个协议。
// 详细VC
protocol SecondViewControllerDelegate: class {
func toggleFeatured (indexOfCell index: Int, isEnable: Bool)
}
Run Code Online (Sandbox Code Playgroud)
当星值改变时,调用此委托函数。
delegate?.toggleFeatured(indexOfCell: indexOfCell, isEnable: isEnable)
Run Code Online (Sandbox Code Playgroud)
在Masterviewcontroller的tableview中didselected函数设置委托
// 主视图控制器
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let detailVC = DetailVC()/* get detalVC object */
detailVC.delgate = self
detailVC.indexOfCell = indexPath.row
//show detailvc
}
Run Code Online (Sandbox Code Playgroud)
如果您不想重新加载完整的 tableview,那么您只能重新加载单元格。
extension MasterViewController: SecondViewControllerDelegate {
func toggleFeatured(indexOfCell index: Int, isEnable: Bool) {
let object = array[index]
// Logic to enable or disable star for for object
tableView.reloadRows(at: [IndexPath(item: index, section: 0)], with: .automatic)
}
}
Run Code Online (Sandbox Code Playgroud)
最重要的
不要忘记使委托变弱。weak 关键字不会让保留计数增加 1,因此不会产生保留周期并且不会出现内存泄漏问题。如果我们不写任何关键字,那么默认情况下它将是强大的,这会增加保留计数并创建保留循环(死锁)。
并且我们需要制作协议类类型,因为弱关键字只能与类类型协议一起使用。检查协议声明,它继承了类
class DetailVC {
weak delegate: SecondViewControllerDelegate?
}
Run Code Online (Sandbox Code Playgroud)
查看此视频以了解内存泄漏并修复它。
https://www.youtube.com/watch?v=sp8qEMY9X6Q
| 归档时间: |
|
| 查看次数: |
2129 次 |
| 最近记录: |