我已经用NSview和一个按钮编码了一个窗口。程序启动时,窗口中将出现一个点。按下按钮后,应该会显示另外三个点,但是代码不会重绘窗口。如果我在draw函数中设置一个Breakpoint,我就会意识到,代码仅在draw函数中第一次停止,而setNeedDisplay-function似乎没有用。我还尝试了display()或needDisplay的一些变体。

我会犯错误还是不能以这种方式编码?

谢谢你的帮助。

My Storyboard

我的代码:

ViewController.swift

import Cocoa
class ViewController: NSViewController {
    @IBAction func buttonStart(_ sender: Any) {
        let asd = ViewAnts()
        asd.simulation()
} }


ViewAnts.swift

import Cocoa
@IBDesignable
class ViewAnts: NSView {
    static var tribeAnts = [Ants]()
    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
        NSColor.white.setFill()
        NSRectFill(dirtyRect)
        ViewAnts.tribeAnts.append(Ants(x: 30, y: 40, size: 2))
        for i in 0...(ViewAnts.tribeAnts.count-1) {
            let point = NSBezierPath()
            point.appendArc(withCenter: NSPoint(x: ViewAnts.tribeAnts[i].x, y: ViewAnts.tribeAnts[i].y), radius: ViewAnts.tribeAnts[i].size, startAngle: 0, endAngle: 360)
            point.stroke()
        }
    }

    func simulation() {
        ViewAnts.tribeAnts.append(Ants(x: 130, y: 40, size: 5))
        ViewAnts.tribeAnts.append(Ants(x: 230, y: 40, size: 5))
        ViewAnts.tribeAnts.append(Ants(x: 20, y: 40, size: 5))

        let rect = NSRect(x: CGFloat(0), y: CGFloat(0), width:CGFloat(500), height: CGFloat(400))
//        needsDisplay = true
        setNeedsDisplay(rect)
//        display(rect)
//        display()
//        draw(rect)
//    display(rect)
    }

}


蚂蚁迅捷

import Cocoa
struct Ants {
    var x: CGFloat
    var y: CGFloat
    var size: CGFloat
}

最佳答案

@IBAction func buttonStart(_ sender: Any) {
    let asd = ViewAnts()
    asd.simulation()



您正在实例化ViewAnts,但从未将视图添加到窗口中。如果您有一个包含ViewAnts实例的窗口(可能是在Interface Builder中创建的),则该视图不是在此处调用其simulation()方法的视图。

如果要用此代码创建视图,则需要将视图添加到窗口中。或者,如果要在IB中创建视图,则需要通过插座或其他某种方式获取对该视图的引用,而不是在此处实例化该视图。

10-08 05:20