Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在单个uitableviewcell中添加子视图_Ios_Swift_Uitableview - Fatal编程技术网

Ios 在单个uitableviewcell中添加子视图

Ios 在单个uitableviewcell中添加子视图,ios,swift,uitableview,Ios,Swift,Uitableview,将UIImageView添加到单个UITableViewCell时,我遇到了一个问题。我在cellForIndexPath委托方法中添加了这样的子视图,只有self.mediaTypeArray在索引:indexPath.row处包含字符串:“Image”时,才会将该子视图添加到单元格中 let cell = self.timelineTableView.dequeueReusableCellWithIdentifier( NSStringFromClass(ClassicCaseCell),

将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)
}

但是,我发现每隔两个单元格都包含相同的imageView,即使self.mediaTypeArray[indexPath.row]不等于“Image”,我也不明白为什么。我认为这可能与可重用的tableviewcells有关,但我仍然不明白它为什么会这样做。请帮忙

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

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


2) 为它指定一个唯一的标记,并在需要设置时查找标记。。。无标记,然后创建它

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

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


2) 为它指定一个唯一的标记,并在需要设置时查找标记。。。没有标签,然后创建它

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

解决此问题的一种方法是覆盖
ClassicCaseCell
preparefore
方法,以从其
证据视图中删除任何图像视图


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

我感觉这是因为单元格被重复使用

解决此问题的一种方法是覆盖
ClassicCaseCell
preparefore
方法,以从其
证据视图中删除任何图像视图


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

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

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


另一种选择是在单元格中不考虑图像视图,并根据需要隐藏/显示它。接下来的挑战是如何最好地管理两组约束,一组用于图像视图可见时,另一组用于图像视图不可见时。您可以通过明智地选择约束优先级、激活/停用
CellForRowatineXpath
中的适当约束等来实现这一点。这是可以做到的,但这比上述方法更麻烦,即您只需使用两个单元格原型。

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

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


另一种选择是在单元格中不考虑图像视图,并根据需要隐藏/显示它。接下来的挑战是如何最好地管理两组约束,一组用于图像视图可见时,另一组用于图像视图不可见时。您可以通过明智地选择约束优先级、激活/停用
CellForRowatineXpath
中的适当约束等来实现这一点。这是可以做到的,但这比上述方法更麻烦,您只需使用两个单元格原型。

在tableview单元格中覆盖prepareForReuse委派并从中删除imageview

在tableview单元格中覆盖prepareForReuse委派并从中删除imageview

谢谢!我想我会选择你的第二个选项,在初始化图像时将其指定为nil谢谢!我想我会选择第二个选项,在初始化时把图像指定为零,但是如果我不知道,我需要多少UIVIEVIEWWS,考虑一个情况,IVIEVIEWS是动态的,取决于数组。