如何正确地将UILabel插入每个t​​ebleview单元格

时间:2014-11-19 16:29:36

标签: uitableview swift uilabel

我在创建UILabel以插入我的tableview单元格时遇到问题。它们插入很好并显示正常,当我去滚动时出现问题。行的排序变得混乱,并且失去了它的初始顺序。例如,在开始时,idLabel的单元格文本从0开始。 14,按顺序排列。向下滚动并备份后,订单可以是5,0,10,3等等。

有关为何发生这种情况的任何想法?我假设我在创建单元格后尝试更新标签是错误的。

var idArr: NSMutableArray!

// In init function
self.idArr = NSMutableArray()
for ind in 0...14 {
    self.idArr[ind] = ind
}

// Create the tableview cells
internal func tableView( tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath ) -> UITableViewCell {
    if cell == nil {
        let id = self.idArr[indexPath.row] as Int
        cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell" )

        // Id
        let idLabel: UILabel = UILabel( frame: CGRectZero )
        idLabel.text = String( id )
        idLabel.textColor = UIColor.blackColor()
        idLabel.tag = indexPath.row
        idLabel.sizeToFit()
        idLabel.layer.anchorPoint = CGPointMake( 0, 0 )
        idLabel.layer.position.x = 15
        idLabel.layer.position.y = 10
        idLabel.textAlignment = NSTextAlignment.Center
        cell?.addSubview( idLabel )
    }

    // Update any labels text string
    for obj: AnyObject in cell!.subviews {
        if var view = obj as? UILabel {
            if view.isKindOfClass( UILabel ) {
                if view.tag == indexPath.row {
                    view.text = String( id )
                }
            }
        }
    }

    // Return the cell
    return cell!
}

感谢您的帮助,我再也看不到树木了。

1 个答案:

答案 0 :(得分:1)

单元格更新中的逻辑会消失。您正在检查在初始化时设置的标记是否等于索引路径的行,但因为应该重用这些单元格,所以情况并非总是如此。如果您只是删除for循环中的标记检查行,它应该可以正常工作。

另外,我不确定你为什么在选择性地将视图作为标签投射后检查ifKindOfClass。

为了防止意外更新Apple的视图,最好为标签添加一个常量标签,然后通过该标签拉动标签,而不是遍历所有子视图。

这显然不是您运行的实际代码,因为id变量不在适当的范围内,并且没有单元格的定义。我已经添加了适当的dequeueing并将id变量移动到可行的东西。我假设您正在使用实际代码执行这些操作。

internal func tableView( tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath ) -> UITableViewCell {
    let labelTag = 2500
    let id = self.idArr[indexPath.row] as Int

    var cell = tableView.dequeueReusableCellWithIdentifier("cell")

    if cell == nil {
        cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell" )

        // Id
        let idLabel: UILabel = UILabel( frame: CGRectZero )
        idLabel.text = String( id )
        idLabel.textColor = UIColor.blackColor()
        idLabel.tag = labelTag
        idLabel.sizeToFit()
        idLabel.layer.anchorPoint = CGPointMake( 0, 0 )
        idLabel.layer.position.x = 15
        idLabel.layer.position.y = 10
        idLabel.textAlignment = NSTextAlignment.Center
        cell?.addSubview( idLabel )
    }

    // Update any labels text string
    if let view = cell?.viewWithTag(labelTag) as? UILabel {
        view.text = String( id )
    }

    // Return the cell
    return cell!
}