在ios7.1模拟器中快速重用单元格,隐藏单元格

时间:2014-12-08 10:05:50

标签: uitableview swift ios8 ios-simulator ios7.1

这完全适用于iOS8.1模拟器。原始代码:

func updateCell(path:Int){
    let indexPath = NSIndexPath(forRow: path, inSection: 0)
    tableView.beginUpdates()
    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade)
    tableView.endUpdates()
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell:PhotoCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as PhotoCell

    if data[indexPath.row].objectId == ""{
        getData.getData(universityData.tableName, sender: self, cellId: indexPath.row)
    }else{
        var subviews = cell.subviews
        for view in subviews{
            view.removeFromSuperview()
        }
    }
    tableView.separatorStyle = UITableViewCellSeparatorStyle.None
    let screenSize: CGRect = UIScreen.mainScreen().bounds
    let screenWidth = screenSize.width;
    tableView.rowHeight = screenWidth + 38
    //Other cell stuff here 
    return cell
}

但是在iOS7.1模拟器上, 1.所有单元格在顶部单元格顶部堆叠在一起,而不是在一秒钟内向下滑动 2.当细胞首次加载时,它们看起来正常 3.在第二个负载上调用" else"在代码中,单元格开始消失而不是重新加载

我找到了这样的答案并尝试以这种方式更改代码:

else{  
    for view in cell.contentView.subviews{
       if view.isKindOfClass(UIView){
            view.removeFromSuperview()
       }
    }
}

案例1和案例2仍在发生。但是细胞在两个图像之间切换,首先是正常的清洁细胞,第二个是旧数据的细胞仍在内部:
image without bug image with bug

好的问题是,如何在iOS 7.1和iOS上同时加载单元格8.1

EDIT2:
Feed View Controller:
http://pastebin.com/aqyxpimi
自定义单元格:
http://pastebin.com/4eMgkBc1

1 个答案:

答案 0 :(得分:2)

每次表视图使用以下代码请求单元格时,您都在更新tableview属性:

tableView.separatorStyle = UITableViewCellSeparatorStyle.None
let screenSize: CGRect = UIScreen.mainScreen().bounds
let screenWidth = screenSize.width;
tableView.rowHeight = screenWidth + 38

这是不必要的,可能会导致问题。在请求第一个单元格之前,行高度没有设置,我怀疑它是导致行高在iOS 7上无法正常工作。相反,您应该只在视图控制器中的viewDidLoad上执行此操作。

此外,没有理由你应该像这样任意删除单元格的所有子视图。您不仅要从直接单元格中删除视图,还要在每次表视图重用时删除它。这意味着在重用单元格时将没有显示数据的视图(如果它被重用于具有数据的行)。相反,您应该填写空数据或默认数据。

修改

查看完整代码后,不应在数据源方法中向子单元添加子视图。每次重复使用单元格时,都会向其中添加其他视图,从而留下旧视图。我看到你试图删除旧视图,但是你不加区别地删除所有子视图,这是一个非常糟糕的主意。

相反,您应该将细胞添加到带有细胞类出口的笔尖,或者您应该在细胞类中以编程方式添加细胞。您可能应该在init(style: UITableViewCellStyle, reuseIdentifier: String?)awakeFromNib中执行此操作,但如果您知道您的单元格总是来自笔尖,则可以选择一个。数据源方法应该只配置自定义视图,而不是创建,添加或删除它们。