卸下电池样板

斯威夫特3.0

在iOS中,单元与可重复使用性的标识符相关联。 一个主要的难题是跟踪哪个小区标识符应该与哪个小区相关联。 借助协议的强大功能,开发人员不再需要手动创建这些标识符。 我们可以在内部将类名用作单元格标识符,并且可以通过包装程序处理所有此类。 一个可命名的协议将解决这个问题。

可命名

 协议可命名{ 
静态var名称:字符串{get}
}
 扩展名为{ 
静态变量名称:字符串{
返回字符串(描述:自我)
}
}
 扩展UIView:可命名的{} 

请注意,所有UIView都可以访问NameProtocol。 现在,我们可以使用类的名称作为单元格标识符。 碰巧的是,UICollectionViewCell继承了UICollectionReusableView的子类,而UICollectionReusableView继承了UIView的子类。 另外,UITableViewCell子类为UIView。 因此,我们的单元已经可以命名了!

寄存器

现在,我们可以使用类名直接在代码中注册单元格。 为了帮助删除更多样板,请将以下方法添加到UITableView扩展中。

 func register(cells:[UITableViewCell.Type]){ 
cells.forEach {
registerClass($0, forCellReuseIdentifier : $0.name)
: $0.name)
}
}

现在,我们可以以简洁的格式优雅地整齐地注册我们的单元格。 您不再需要跟踪那些令人讨厌的标识符!

出队

现在已经注意了寄存器部分,让我们看一下出队。 将以下方法添加到您的UITableView扩展。

  func dequeueReusableCell  
(对于indexPath:IndexPath)-> T {
返回dequeueReusableCell(withIdentifier:T.name,for:indexPath)为! Ť
}

这将使用正确的标识符使单元出队。 同样,此包装器将返回适当的UITableViewCell子类。

行动中

在ViewControllers的viewDidLoad中,您可以注册单元格。

  tableView.register([firstTableViewCell.self]) 

在cellForRowAtIndexPath中,可以使用出队包装器。

 让单元格:firstTableViewCell = tableView.dequeueReusableCell(for:indexPath) 

通过使用可命名协议,消除了注册和出队的样板。 为了支持UICollectionViewCell,可以创建类似的UICollectionView扩展并提供类似的包装器。 这些细胞毕竟是可命名的