OSX Swift, нарисуйте простую линию нажатием кнопки

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

Ниже мой класс View и View Controller.

    //
//  LineDrawer.swift
//  TestDraw3
//
//  Created by Colin Wood on 21/04/17.
//  Copyright © 2017 Colin Wood. All rights reserved.
//

import Cocoa



class LineDrawer : NSView {
// Vars
    var newLinear = NSBezierPath()


    public var QQ: Int = 0 {   // every time QQ changes redraw information in QQ
        didSet{
            boom()    // drawing method
        }
    }



// Methods
    override func draw(_ dirtyRect: NSRect) {
        NSColor.red.set()
        newLinear.lineWidth = 5
        newLinear.lineCapStyle = NSLineCapStyle.roundLineCapStyle
        newLinear.stroke()
    }

    func boom(){  // draw a simple line
        Swift.print("In BooM")
        Swift.print(QQ)
        let lastPt = NSPoint(x: QQ, y: 1)
        newLinear.move(to: lastPt)
        let newPt = NSPoint(x: QQ, y: 50)
        newLinear.line(to: newPt)
        needsDisplay = true
    }

     override func mouseDown(with theEvent: NSEvent) {
        QQ = QQ + 7  // just add 7 so you can see it being drawn after didSet 
    }

}


//
//  ViewController.swift
//  TestDraw3
//
//  Created by Colin Wood on 15/04/17.
//  Copyright © 2017 Colin Wood. All rights reserved.
//

import Cocoa

class ViewController: NSViewController {
// Vars
    @IBOutlet weak var textField: NSTextField!

// Methods
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.

        }
    }


    @IBAction func button(_ sender: Any) {
        let v = LineDrawer()
        v.QQ = 300  // change QQ to call didSet
    }

}

1 ответ

Решение

Вы должны добавить свой LineDrawer как подпредставление. Хорошее место, чтобы добавить это, находится в viewDidLoad метод:

private var line: LinerDrawer!

override func viewDidLoad() {
    super.viewDidLoad()
    line = LinerDrawer()
    line.frame = NSMakeRect(0, 0, 200, 200)
    line.QQ = 300
    line.isHidden = true
    view.addSubview(line)
}

И, наконец, показать это, когда вы нажмете кнопку:

@IBAction func button(_ sender: Any) {
    line.isHidden = false
}

Вам все еще нужно выработать правильный frame для тебя LineDrawer Посмотреть.

Другие вопросы по тегам