在单个uitableviewcell

时间:2016-06-26 18:33:09

标签: ios swift uitableview

我遇到了将UIImageView添加到单个UITableViewCell的问题。我在cellForIndexPath委托方法中添加这样的子视图,如果self.mediaTypeArray包含字符串,则该方法仅添加到单元格中:" Image"在索引:indexPath.row

let cell = self.timelineTableView.dequeueReusableCellWithIdentifier( NSStringFromClass(ClassicCaseCell), forIndexPath: indexPath) as? ClassicCaseCell

if self.mediaTypeArray[indexPath.row] == "Image" {

    let imageView = UIImageView()
    imageView.frame.size = (cell?.evidenceView.frame.size)!
    imageView.frame.origin = CGPointZero
    imageView.image = img

    cell?.evidenceView.addSubview(imageView)
}

然而,它发挥得很好,我发现即使self.mediaTypeArray [indexPath.row]不等于"图像"其他每两个单元格都包含相同的imageView。而且我不明白为什么。我认为它可能与可重复使用的tableviewcells有关,但我仍然不明白为什么会这样做。请帮忙!

4 个答案:

答案 0 :(得分:2)

我感觉这是因为细胞被重复使用。

您可以解决此问题的方法是覆盖ClassicCaseCell的{​​{1}}方法,以从prepareForReuse中移除任何图片视图。

但我建议您不要以这种方式添加图像视图(通过委托的evidenceView方法)。相反,您的cellForIndexPath应该将图片视图保存为实例变量,然后您可以在ClassicCaseCell中设置该变量。这样,最多只有一个。您还可以确保在cellForIndexPath中将图像视图设置为nil,确保它未在单元格中显示(如果未设置)。

答案 1 :(得分:1)

首先,不要按照别处的建议使用tag财产。这是很久以前使用的技术,但Apple现在不鼓励这种做法。其次,我建议您简化生活,不要在cellForRowAtIndexPath中以编程方式添加图片视图。如果以编程方式添加图像视图,则单元格重用会引入一个笨拙的过程来确定(a)是否需要图像视图; (b)是否有现有的图像视图; (c)可能添加/删除图像视图和/或获取现有视图。

一个非常简单的解决方案是只有两个单元格原型,一个带有图像视图,另一个没有。然后,根据媒体类型,使用适当的故事板标识符将单元格出列并使用它。

另一种选择是在单元格中设置图像视图,并隐藏/显示它。然后挑战变成如何最好地管理两组约束,一组用于图像视图可见时,另一组用于图像视图不可见时。您可以通过明智地选择约束优先级,激活/停用cellForRowAtIndexPath中的相应约束等来完成此操作。可以这样做,但这比上述方法更麻烦,因此您只需使用两个单元原型。 / p>

答案 2 :(得分:0)

你只需要添加UIImageView一次,如果再次重复使用该单元格,它(可能)已经存在。您的问题是检测您是否已添加它。以下是一些建议:

1)总是创建它(只是不设置图像,或隐藏它)

2)为它分配一个唯一的标签,当你需要设置它时寻找标签......没有标签,然后创建它

答案 3 :(得分:0)

在tableview单元格中覆盖prepareForReuse委托,并从那里删除imageview