2016-09-22 4 views
0

У меня есть массив CGPoints. Мне нужна персональная метка для каждой четвертой точки в массиве, поэтому мне нужно создать несколько NSTextFields программно. Я могу добавлять точки с помощью щелчков мыши и создавать как можно больше очков. Ярлыки для этих точек должны быть активными, чтобы одновременно показывать текст для пользователя. Как мне это сделать?Как программно создать несколько NSTextFields?

(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 ярлыков.

ответ

2

Я вижу только одна метка

Теперь, когда я расправил свои фигурные скобки и отступы, это легко понять, почему. Ваша петля неправильно построена, так что вы создаете одну метку и меняете ее кадр четыре раза. Вам нужно создать четыре отдельные метки с четырьмя отдельными кадрами.

+0

Как я должен писать код? – andy

+0

Подумайте, как бы вы сказали ребенку сделать это. Сделайте ярлык, поместите его в интерфейс, дайте ему рамку. Loop again: make _another_ label, поместите _it_ в интерфейс, дайте _it_ кадр - другой кадр. Петля снова ... Понимаете? Один цикл должен охватывать весь этот набор вещей. – matt

+1

Тогда сначала не используйте цикл. Просто практикуйте, создав одно текстовое поле и поместив его в интерфейс. Затем сделайте одно текстовое поле и поместите его в интерфейс, а затем создайте поле _another_ test и поместите _it_ в интерфейс. Другими словами, просто создайте два текстовых поля и поместите их как в интерфейс, так и в разные места. Если вы научитесь это делать, будет очевидно, как повторить это как цикл, потому что вы можете видеть, что общего, а что отличается. – matt

0

Код для создания нескольких NSTextFields:

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]) 
     } 
    } 
Смежные вопросы