UITableView cellForRowAtIndexPath 使用重用标识符时出现问题



我的表设置完美,当我滚动浏览它并调用cellForRowAtIndexPath来加载实际行时,它有一秒钟的延迟,它会冻结并导致表不流畅。我做了一些研究,为什么会这样,据我所知,这是因为我没有重复使用细胞。我用 swift 编程,我也是相当新的。我想知道是否有人可以帮助修复我的 Swift 代码以重用单元格,以便当我滚动表格时它流畅且无延迟。

这是我的代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        mainTableView.estimatedRowHeight = 50.0
        mainTableView.rowHeight = UITableViewAutomaticDimension
        var cell : postWithTitleAndImageTableViewCell = mainTableView.dequeueReusableCellWithIdentifier("postWithTitleAndImage") as postWithTitleAndImageTableViewCell
        var imageID = json[indexPath.row]["imageName"] as String
        var id = json[indexPath.row]["id"] as String
        var isImage = json[indexPath.row]["isImage"] as String
        var title = json[indexPath.row]["name"] as String
        var text = json[indexPath.row]["post"] as String
        var time = json[indexPath.row]["time"] as String
        var popularity = json[indexPath.row]["popularity"] as String
        //add clientid
        //time handle in the cell class
        lastID = id
        cell.setCell(id, title: title, imageID: imageID, text: text, time: time, popularity: popularity)
        return cell as postWithTitleAndImageTableViewCell
    }

如果我需要提供更多信息,请告诉我。解决这个问题非常重要。

编辑:我已经在我的代码中找到了性能问题所在。在我的自定义单元格类中,有一个 setCell 函数来设置单元格中的所有内容。在此代码中,我有一个 Web 请求来获取图像。这是一个必要的调用,所以我想解决性能问题。

这是设置单元格:

    public func setCell(id: String, title: String, imageID: String, text: String, time: String, popularity: String){
        println("setCell called")
        readIDs.append(id)
        postID = id
        let colors = ["person-blue.png", "person-green.png", "person-orange.png", "person-pink.png", "person-purple.png", "person-red.png", "person-yellow.png"]
        let randomIndex = Int(arc4random_uniform(UInt32(colors.count)))
        var imageName = (colors[randomIndex])
        var cellHeight = TableViewCell.frame.height
        let font = UIFont(name: "Arial Rounded MT Bold", size: 14.0)
        labelHeightConstraint.constant = heightForView(text, font: font!, width: postText.frame.width)
        postImage.clipsToBounds = true
        var timeDouble = time as NSString
        var phpTime = timeDouble.doubleValue
        var currentDate = NSDate()
        var postDate = NSDate(timeIntervalSince1970: phpTime as NSTimeInterval)
        var postTimeOffset = currentDate.offsetFrom(postDate) as String
        /*let url = NSURL(string: "http://bangedabigailtwice.tk/kno/getImage.php?id=(imageID)")
        var err: NSError?
        var imageData :NSData = NSData(contentsOfURL: url!,options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err)!
        var imageFromURL = UIImage(data:imageData)
        */
        self.personImage?.image = UIImage(named: imageName)
        self.postTitle?.text = title
        self.postText?.text = text
        //self.postImage?.image = imageFromURL
        self.postImage.userInteractionEnabled = true
        self.postTime?.text = postTimeOffset 
        self.popularityOutlet?.text = popularity
        let recognizer = UITapGestureRecognizer(target: self, action:Selector("tapImageView:"))
        recognizer.numberOfTapsRequired = 2
        postImage.addGestureRecognizer(recognizer);
    }

如果您查看上面的代码,我已经注释掉了导致性能问题的行。现在对于我的问题,我如何临时存储图像以供以后使用,以及如何在存储临时存储的图像后转储它们?

mainTableView.estimatedRowHeight = 50.0
mainTableView.rowHeight = UITableViewAutomaticDimension

为表中的每一行调用。这只需要一次,所以你最好把它们移到 viewDidLoad .

无需向下转换返回的单元格:

return cell as postWithTitleAndImageTableViewCell

所以一个

return cell

就足够了。

对于代码中的 json 部分,如果存在任何性能问题,则无法在此处看到。

最新更新