繁体   English   中英

在单个uitableviewcell中添加子视图

[英]adding subview in a single uitableviewcell

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

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]不等于“ Image”,其他两个单元格都包含相同的imageView,我也不明白为什么。 我认为这可能与可重用的tableviewcell有关,但我仍然不明白为什么会这样做。 请帮忙!

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

解决此问题的一种方法是重写ClassicCaseCellprepareForReuse方法,以从其evidenceView视图中删除任何图像视图。

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

首先,不要使用其他地方建议的tag属性。 那是很久以前使用的技术,但是苹果现在不鼓励这样做。 其次,建议您简化生活,不要在cellForRowAtIndexPath编程方式添加图像视图。 如果以编程方式添加图像视图,则单元重用会引入笨拙的过程来确定(a)是否需要图像视图; (b)是否有现有的影像视图; (c)可能添加/删除图像视图和/或获取对现有视图的引用。

一个非常简单的解决方案是只具有两个单元原型,一个具有图像视图,另一个不具有图像视图。 然后,根据媒体类型,使用适当的情节提要板标识符使单元出队并使用它。

另一种选择是不考虑单元中的图像视图,并适当地隐藏/显示它。 接下来的挑战是如何最好地管理两组约束,一组约束用于图像视图可见时,另一组约束在图像视图不可见时。 您可以通过明智地选择约束优先级,激活/停用cellForRowAtIndexPath等中的适当约束来执行此操作。可以做到这一点,但这比上述方法麻烦,因为您仅使用两个像元原型。

您只需要添加一次UIImageView,因此,如果再次使用该单元,则它可能已经存在。 您的问题是检测是否已添加它。 这里有一些建议:

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

2)为它分配一个唯一的标签,并在需要设置它时查找该标签...没有标签,然后创建它

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM