gpt4 book ai didi

ios - Swift:在 Tableview 的特定单元格中添加子层而不是每个单元格

转载 作者:行者123 更新时间:2023-11-28 06:42:46 27 4
gpt4 key购买 nike

我有一个 tableView 显示用于从 CoreData 保存数据的数据。该表是一天的,单元格按当时的读数排序。我每次保存有很多读数,所以我有一个单元格将所有数据显示为 View 中的子标签,看起来像单元格中的另一个表(没有将表放在单元格方法中)。一切都很好,但我有一张痛苦图,显示您保存位置的位置。我让它在图表上的正确位置显示该点,但是当它出现时,它会在当天的所有时间将该点添加到该图表的每个单元格。如何为要添加的子层指定特定的单元格?

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let OurData = people[indexPath.row] as! UserData

let cell: CalenderDataTableViewCell = tableView.dequeueReusableCellWithIdentifier("dataCalenderCell") as! CalenderDataTableViewCell

cell.backgroundColor = GlobalColourConstants.tableViewBackground


// MARK: diagram cell

// LocationX and LocationY represent the decimal ration of how far from the origin the point is e.g. (locationX: 0.5, locationY: 0.5) = centrePoint

if let locationX: Float = OurData.painDiagramLocationX {
print("locationx \(locationX)")

if locationX == 0 {
cell.painLocationBackgroundView.layer.borderColor = GlobalColourConstants.noteColourArray[0].CGColor
cell.painLocationBackgroundView.layer.backgroundColor = UIColor.clearColor().CGColor

// This cell.painLocationImageView = nil is suppose to remove image from cells that don't have a pain diagram. However it crashes the table.

// cell.painLocationImageView = nil
} else {

let imageName = "Torso Female"
let image = UIImage(named: imageName)
cell.painLocationImageView.image = image

if let locationY: Float = OurData.painDiagramLocationY {
cell.painLocationBackgroundView.layer.borderColor = GlobalColourConstants.painColourArray[0].CGColor
cell.painLocationBackgroundView.layer.backgroundColor = GlobalColourConstants.painColourArray[0].CGColor

print("locationy \(locationY)")

let pictureOriginX = (cell.painLocationImageView.bounds.origin.x)
let pictureOriginY = (cell.painLocationImageView.bounds.origin.y)

let pointOriginX = cell.painLocationImageView.bounds.width * CGFloat(locationX)
let pointOriginY = cell.painLocationImageView.bounds.height * CGFloat(locationY)

let circleRadius = CGFloat(8)

let circlePath = UIBezierPath(arcCenter: CGPoint(x: pointOriginX,y: pointOriginY), radius: circleRadius, startAngle: CGFloat(0), endAngle:CGFloat(M_PI * 2), clockwise: true)

let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.CGPath

//change the fill color
shapeLayer.fillColor = UIColor.redColor().CGColor
//you can change the stroke color
shapeLayer.strokeColor = UIColor.whiteColor().CGColor
//you can change the line width
shapeLayer.lineWidth = 1.0

cell.painLocationImageView.layer.addSublayer(shapeLayer)

}
}
}

最佳答案

只是一个简短的概述,所以你得到你的答案

UITableView 经过高度优化,因此只在内存中保留屏幕上可见的行。现在,所有行 Cells 都缓存在 Pool 中,并被重用而不是重新生成。每当用户滚动 UITableView 时,它都会在 Pool 中添加刚刚隐藏的行,并将它们重新用于下一个可见行。 所以你在一个单元格中添加子层,一旦单元格被重用,你就会在其他单元格中看到相同的子层。

那么,现在,来回答你的问题

在你的方法 cellForRowAtIndexPath 中——

始终重置每个索引的值:

例如。 如果条件为真添加子层,如果不满足则移除子层

一个建议

因为你是dequeueReusableCellWithIdentifier,这是最好的优化,但是因为你是以编程方式添加一个子层,在 View 被出列之后,你很有可能在已经有子层的 View 上添加子层添加。

您应该获取对您的子层的引用,并检查它是否尚未添加。

关于ios - Swift:在 Tableview 的特定单元格中添加子层而不是每个单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37494349/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com