如何用标签显示正确的摘要

时间:2019-05-19 06:56:21

标签: swift uitableview

我正在使用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)

    }
}

1 个答案:

答案 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