在 SWIFT OS X 中以编程方式添加和删除 NSTextField
Posted
技术标签:
【中文标题】在 SWIFT OS X 中以编程方式添加和删除 NSTextField【英文标题】:Adding and removing NSTextField programatically in SWIFT OS X 【发布时间】:2015-07-10 12:20:35 【问题描述】:我正在尝试在表示各种数据点的图形视图上编写文本标签(想象 Excel 中的折线图)。
我使用 tableView 选择数据集。每次选择一个新数据集时,都会重新绘制图表。
我可以使用自定义视图绘制折线图。没问题。
我可以使用从 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()
【讨论】:
以上是关于在 SWIFT OS X 中以编程方式添加和删除 NSTextField的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 5 中以编程方式从右上角添加垂直按钮列表
iOS - 在 Swift 3 中以编程方式删除和激活新约束时布局损坏
在 SWIFT 2.x 中以编程方式使用 NavigationController 调用 UIViewController