我有一个自定义视图要添加到我的单元格containView中。
但是,当我更新数据时,使用reloadData重新加载tableview。
视图不会像什么都没有发生一样发生变化。
我想在视图中添加一项“ A6”。
我怎么了
有什么想法可以刷新视图吗?谢谢。
我的看法如下图。
这些项目会更新到infos数组。
class ViewController: UIViewController {
var alreadyLoadCell: Bool = false
var initInfos = [Info(name: A1, color: UIColor.A1), Info(name: A2, color: UIColor.A2), Info(name: A3, color: UIColor.A3), Info(name: A4, color: UIColor.A4), Info(name: A5, color: UIColor.A5)]
var updateInfos = [Info(name: A1, color: UIColor.A1), Info(name: A2, color: UIColor.A2), Info(name: A3, color: UIColor.A3), Info(name: A4, color: UIColor.A4), Info(name: A5, color: UIColor.A5), Info(name: A6, color: UIColor.A6)]
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row == 0 {
let customCell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath) as! CustomTableViewCell
if alreadyLoadCell == false {
customCell.initCell(infos: initInfos)
alreadyLoadCell = true
}else{
//TODO: reloadData to update cell
customCell.updateCell(infos: updateInfos)
}
return customCell
}
return UITableViewCell()
}
}
class CustomTableViewCell: UITableViewCell {
var testItemView: UIView?
func initCell(infos: [Info]) {
self.testItemView = createItemView(infos: infos)
self.contentView.addSubview(testItemView!)
testItemView?.snp.makeConstraints { (make) in
make.left.equalTo(13)
make.top.equalTo(10)
make.right.equalTo(-13)
make.height.equalTo(195)
make.bottom.equalTo(-10)
}
}
func updateCell(infos: [Info]) {
self.testContainView = createItemView(infos: infos)
//How to update successful?
}
func createItemView(infos: [Info]) -> UIView {
let contentView = UIView()
var serialNumber = 0
var previousView: TitleView?
for info in infos {
let view = TitleView(assets: info, color: info.color)
contentView.addSubview(view)
switch serialNumber {
case 0: //A1
view.snp.makeConstraints { (make) in
make.left.equalTo(15)
make.width.equalTo(135)
make.top.equalToSuperview()
}
previousView = view
case 1: //A2
view.snp.makeConstraints { (make) in
make.right.equalToSuperview().offset(-15)
make.width.equalTo(135)
make.top.equalToSuperview()
}
previousView = view
case 2: //A3
view.snp.makeConstraints { (make) in
make.left.equalTo(15)
make.width.equalTo(135)
make.top.equalTo((previousView?.snp.bottom)!).offset(5)
}
previousView = view
case 3: //A4
view.snp.makeConstraints { (make) in
make.right.equalToSuperview().offset(-15)
make.width.equalTo(135)
make.centerY.equalTo((previousView?.snp.centerY)!)
}
previousView = view
case 4: //A5
view.snp.makeConstraints { (make) in
make.left.equalTo(15)
make.width.equalTo(135)
make.top.equalTo((previousView?.snp.bottom)!).offset(5)
}
previousView = view
case 5: //A6
view.snp.makeConstraints { (make) in
make.right.equalToSuperview().offset(-15)
make.width.equalTo(135)
make.centerY.equalTo((previousView?.snp.centerY)!)
}
previousView = view
default:
break
}
serialNumber += 1
}
return contentView
}
}
答案 0 :(得分:1)
首先,在更新单元格之前,应从早期启动的testItemView
中删除超级视图,因为在updateCells
方法中,您将创建testItemView
的新实例,并再次为新创建的视图约束添加
我认为这段代码应该对您有用,替换您的updateCell方法:
func updateCell(infos: [Info]) {
testContainView.removeFromSuperView
testContainView = createItemView(infos: infos)
contentView.addSubview(testItemView!)
testItemView?.snp.makeConstraints { (make) in
make.left.equalTo(13)
make.top.equalTo(10)
make.right.equalTo(-13)
make.height.equalTo(195)
make.bottom.equalTo(-10)
}
}
答案 1 :(得分:1)
在可重复使用的单元格内重新创建元素是不合适的。那会影响应用本身的性能。想象一下,具有1000个具有这种布局的单元格,每次滚动它都会从头开始重新创建所有内容。
您使用相同的函数“ createItemView”进行更新和初始化,这是不必要的。
相反,使用所有元素和最初隐藏的A6元素创建自定义xib布局。将所有元素从xib连接到您的自定义单元格类。这样,您将始终拥有所有元素,并且只需要更新信息的值即可。
因此,在cellForRowAt函数内部,而不是调用init或update,只需更新数据即可:
customCell.someLabel.text = "example text"
或
if infos.count == 6 {
// this could mean that you have A6 in your array
customCell.A6.isHidden = false
customCell.A6. // change A6 element as you wish
} else {
customCell.A6.isHidden = true
}