如何以编程方式创建多个 NSTextField?

Posted

技术标签:

【中文标题】如何以编程方式创建多个 NSTextField?【英文标题】:How to programmatically create several NSTextFields? 【发布时间】:2016-09-22 23:23:56 【问题描述】:

我有一个 CGPoints 数组。我需要为数组中的每四个点设置一个个人标签,因此我需要以编程方式创建几个 NSTextField。我可以通过鼠标点击添加点,并且可以创建任意数量的点。这些点的标签必须全部激活才能同时向用户显示文本。我该怎么做?

(macOS、Xcode 7、Swift 2)

这是我的代码:

import Cocoa
@NSApplicationMain

class AppDelegate: NSObject, NSApplicationDelegate 
    @IBOutlet weak var window: NSWindow!
    @IBOutlet weak var drawView: DrawView!
    @IBOutlet weak var view: NSView!
    let label = NSTextField(frame: NSMakeRect(0,0,100,50))
    var pointsArray: [CGPoint] = []

    func applicationWillUpdate(aNotification: NSNotification) 
        label.backgroundColor = NSColor.clearColor()
        label.bezeled = false
        label.stringValue = "\(pointsArray.count/4)"


        var multiple = (1...25).map  _ in label 


        for index in 0..<(pointsArray.count/4) 

            let point = CGPoint(x: pointsArray[index*4].x, y: pointsArray[index*4].y)
            label.frame = CGRect(origin: point, size: CGSize(width: label.bounds.width, height: label.bounds.height))

            let sticker = multiple[index]
            view.addSubview(sticker)
        
    

在运行时我只看到一个标签,但我需要同时看到几个标签(每四个 CGPoint)。如果我有 100 个 CGPoints,我必须有 25 个标签。

【问题讨论】:

【参考方案1】:

我只看到一个标签

现在我已经理顺了你的花括号和缩进,很容易理解为什么。您的循环构造不正确,因此您创建了一个标签并更改了四次框架。您需要使用四个单独的框架创建四个单独的标签。

【讨论】:

想想你会如何告诉孩子这样做。做一个标签,放在界面里,给它一个框架。再次循环:制作另一个标签,将it放入界面,给it一个框架——一个不同的框架。再次循环...你看到了吗?一个循环需要包含整套东西。 那么一开始就不要使用循环。只需制作一个文本字段并将其放入界面中即可练习。然后制作一个文本字段并将其放入界面中,然后制作另一个测试字段并将it放入界面中。换句话说,只需制作两个文本字段并将它们都放在界面中的不同位置。如果您能学会这样做,那么如何将其重新表达为循环将是显而易见的,因为您可以看到共同点和不同点。 谢谢马特,我成功了。【参考方案2】:

创建多个 NSTextField 的代码:

import Cocoa
@NSApplicationMain

class AppDelegate: NSObject, NSApplicationDelegate 
    @IBOutlet weak var window: NSWindow!
    @IBOutlet weak var drawView: DrawView!
    var view = NSView(frame: NSMakeRect(0,0,1920,1080))
    var pointsArray: [CGPoint] = []

    var label1 = NSTextField(frame: NSMakeRect(0,0,100,50))
    var label2 = NSTextField(frame: NSMakeRect(0,0,100,50))
    var label3 = NSTextField(frame: NSMakeRect(0,0,100,50))
    .............
    .............
    var label25 = NSTextField(frame: NSMakeRect(0,0,100,50))

    func applicationWillUpdate(aNotification: NSNotification) 

        var labelArray = [label1, label2, label3, ..... label25]

        for i in 0..<(pointsArray.count/4) 

            labelArray[i].backgroundColor = NSColor.clearColor()
            labelArray[i].bezeled = false
            labelArray[i].stringValue = "\(i+1)"

            let point = CGPoint(x:(pointsArray[i * 4].x), y:(pointsArray[i * 4].y))

            var originPoint: [CGPoint] = []
            originPoint.append(point)

            labelArray[i].frame = CGRect(origin: originPoint[0], 
                size: CGSize(width: labelArray[i].bounds.width, height: labelArray[i].bounds.height))

            view.addSubview(labelArray[i])
        
    

【讨论】:

以上是关于如何以编程方式创建多个 NSTextField?的主要内容,如果未能解决你的问题,请参考以下文章

达到字符数后,如何以编程方式将光标从一个 NSTextField 移动到另一个?

在 Swift 中以编程方式创建 NSTextField

NSTextField 和 AutoLayout:自动增长高度 -> 以编程方式

在 SWIFT OS X 中以编程方式添加和删除 NSTextField

如何在 ios swift 中以编程方式创建自动布局等宽约束?

使用 Swift 在 NSTextField 中垂直对齐文本