Swift:Tableview中特定单元格中的addSublayer不是每个单元格

时间:2016-05-28 01:26:01

标签: ios swift uitableview addsubview

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

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)

      }
    }
  }

1 个答案:

答案 0 :(得分:1)

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

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

所以,现在,回答你的问题

在您的方法cellForRowAtIndexPath -

始终重置每个索引的值:

对于前。 如果条件为真,则添加子图层,否则删除子图层

建议之词

由于你是dequeueReusableCellWithIdentifier,它是最优化的,但由于你是以编程方式添加子图层,因此在视图出列后,你很可能在视图上添加了子图层,这些子图层已经有了子图层加入。

您应该参考您的子图层,并检查它是否已经添加。