我正在使用tableview,在左上角标记为“发送”的按钮,在右上角标记为。按下按钮将产生以下结果。每第7行将显示pic3,每第3行将显示pic2,其他行将显示pic1。 右上角的标签显示图片分数的总和。 图片1:4 图片2 图片3:1
我可以插入新行并始终校正图片,但标签显示的摘要不正确
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var lblRowStatus: UILabel!
@IBOutlet weak var tblList:UITableView!
var imgName = [String]()
var pic1 = [String]()
var pic2 = [String]()
var pic3 = [String]()
override func viewDidLoad() {
super.viewDidLoad()
tblList.tableFooterView = UIView.init(frame: .zero)
tblList.dataSource = self
tblList.delegate = self
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return imgName.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for : indexPath)
let pathRow = indexPath.row + 1
if pathRow % 7 == 0{
cell.imageView?.image = UIImage(named: "pic3")
pic3.append("pic3")
}else if pathRow % 3 == 0{
cell.imageView?.image = UIImage(named: "pic2")
pic2.append("pic2")
}else {
cell.imageView?.image = UIImage(named: "pic1")
pic1.append("pic1")
}
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 30.0
}
@IBAction func addRow(_ sender: UIButton) {
tblList.beginUpdates()
imgName.insert("New Element", at: 0)
tblList.insertRows(at: [IndexPath(row: -1 , section: 0)], with: .automatic)
tblList.endUpdates()
self.lblRowStatus.text = "pic1: \(pic1.count)\npic2: \(pic2.count)\npic3: \(pic3.count)"
print(imgName.count)
}
}
答案 0 :(得分:0)
这可能是因为表视图仅在需要显示另一行时才调用cellForRowAtIndexPath
。例如,假设您的表格视图有100行,但屏幕上只有10行可见。 cellForRowAtIndexPath
只会被调用10次才能获得实际可见的单元格。
向下滚动时,cellForRowAtIndexPath
一遍又一遍被调用,以加载下面的单元格。向上滚动时,还会调用cellForRowAtIndexPath
,以加载上方的单元格。这是因为表视图将重用顶部的单元格并将其放在底部,因此当您向下滚动时,表视图的顶部实际上已经消失了,需要再次重新加载。
基本上,我的意思是,不要依靠cellForRowAtIndexPath
来计算每个图像有多少个。自己做数学。
要计算有多少pic3,请执行
let pic3Count = imgName.count / 7
要计算有多少pic2,请执行
// remember to subtract imgName.count / 21! Those are the rows divisible by both 7 and 3, in which pic3 will be displayed
let pic2Count = imgName.count / 3 - imgName.count / 21
要计算pic1的数量,请执行以下操作:
let pic1Count = imgName.count - pic2Count - pic3Count