2015-07-10 6 views
1

Я пытаюсь написать текстовые метки на графическом представлении, представляющем множество точек данных (представить линейный граф в Excel).Добавление и удаление NSTextField программно в SWIFT OS X

Я выбираю набор данных с помощью таблицыView. Каждый раз, когда вы выбираете новый набор данных, график перерисовывается.

Я могу нарисовать линейный график, используя пользовательский вид. Нет проблем.

Я могу рисовать текстовые метки с помощью следующей функции вызывается из DrawRect():

func drawDataPointLabels(size: CGSize) { //size is the view.bounds 

    var dataLabelsArray: [(NSColor, String, NSRect)] = [] 

    // graphDetails contain an array of tuples [(),(),(),()] - this represents one graph type = eg Monthly Fees ** there will be a maximum of 12 items in the array 
    for graphDetails in graphDetailsArray { 

     // each dataPoint object is a tuple (graphType: columnLabel: columnColor: columnHeight: columnNumber:) representing one dataPoint 
     for dataPoint in graphDetails { 
      let graphHeight = size.height/2 
      let graphWidth = size.width - graphOrigin.x - rightMargin 
      let columnAndGapSize = graphWidth/25 
      let labelX: CGFloat = (graphOrigin.x + columnAndGapSize) + (columnAndGapSize * dataPoint.columnNumber) * 2 
      let labelY: CGFloat = dataPoint.columnHeight * (graphHeight - topMargin - bottomMargin) 

      // determine the location and frame for the text label to match dataPoint 
      let textFrame = NSRect(x: labelX, y: labelY, width: 30, height: 10) 
      let dataPointTuple = (dataPoint.columnColor, dataPoint.columnLabel, textFrame) 
      dataLabelsArray.append(dataPointTuple) 
     } 

     for dataPoint in dataLabelsArray { 
      let (color, label, frameRect) = dataPoint 
      let lblDataPoint = NSTextField(frame: frameRect) 
      lblDataPoint.stringValue = label 
      lblDataPoint.backgroundColor = backgroundColor 
      lblDataPoint.textColor = color 
      self.addSubview(lblDataPoint) 
     } 
    } 
} 

Однако, я не могу работать, как удалить метки данных, когда представление обновляется и новый набор данных представил. График перерисовывается, но текстовые метки остаются из предыдущего набора данных.

Любые рекомендации/предложения будут оценены.

ответ

1

Добавление следующего кода в начало функции решило проблему для меня.

 let subViewsToRemove = self.subviews 

     for object in subViewsToRemove { 
      object.removeFromSuperview() 
     } 
Смежные вопросы