我已经用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中创建视图,则需要通过插座或其他某种方式获取对该视图的引用,而不是在此处实例化该视图。