TableViewCell 委托与 Swift

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 中。我接下来该怎么做?

Hit*_*wal 5

在 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