卸下电池样板
斯威夫特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扩展并提供类似的包装器。 这些细胞毕竟是可命名的