我在创建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!
}
感谢您的帮助,我再也看不到树木了。
答案 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!
}