优化:局部刷新,时刻谨记View和数据源分离
继承UITableViewDataSource
和UITableViewDelegate
然后指定数据源:
_tableView.backgroundColor = AppColor.main_them
_tableView.delegate = self
_tableView.dataSource = self
_tableView.separatorStyle = .none
//GameListViewCell派生UITableViewCell
//forCellReuseIdentifier作为一类Cell的标记,随便定义
//关于register方法,本人不太推荐,不好维护
//_tableView.register(GameListViewCell.self, forCellReuseIdentifier: "list_speed_cell")
重写UITableViewDataSource
指定数据的种类和数量以及根据forCellReuseIdentifier
返回对应的cell
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//返回section中的行数量
return _gameData.count
}
//返回cell
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//网上很多博客的用法都是使用dequeueReusableCell
//在这里不建议,一是不方便维护,二是如果存在滑动删除的话,在刷新的时候删除会缩回
//这里本人建议使用一个Cell池,大小为当前窗口可显示的大小的2倍即可。
//刷新局部或者指定Cell的时候,遍历Cell池查找指定的Cell刷新即可,因为如果用户可见,则Cell一定在池子中
//let cell = tableView.dequeueReusableCell(withIdentifier: "list_speed_cell",for:indexPath) as! GameListViewCell
let cell = _cellPool[indexPath.row%_cellPoolMax]
cell._delegate = self
cell.setData(gameItem: _gameData[indexPath.row])
print("cell row:\(indexPath.row),selection:\(indexPath.section)")
return cell;
}
如果需要自定义Cell的话,可以直接从UITableViewCell派生,然后在构造里面初始化UI,在layoutSubviews里面进行布局即可。
class GameListViewCell: UITableViewCell {
override func layoutSubviews() {
super.layoutSubviews()
//进行子控件布局
}
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
initView()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
initView()
}
private func initView() {
//进行UI规划,关于UI布局篇可以参考
//https://blog.csdn.net/CAir2/article/details/120198494
}
}
至于更多关于Selection和Row之间的关系以及自定义UI,可以自行学习。