我已经编写了一个带有 NSview 和按钮的窗口。当程序启动时,窗口中会出现一个点。按下按钮后,应该会出现另外三个点,但代码不会重绘窗口。如果我在绘图函数内设置断点,我发现代码仅在绘图函数中第一次停止,并且 setNeedDisplay 函数似乎毫无用处。我还尝试了 display() 或 needDisplay 的一些变体。
我是否犯了错误或者我不能以这种方式编码?
感谢您的帮助。
我的代码:
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)
}
}
Ants.swift
import Cocoa
struct Ants {
var x: CGFloat
var y: CGFloat
var size: CGFloat
}
最佳答案
@IBAction func buttonStart(_ sender: Any) { let asd = ViewAnts() asd.simulation()
您正在实例化 ViewAnts
,但您从未将 View 添加到窗口中。如果您有一个包含 ViewAnts
实例的窗口(可能是在 Interface Builder 中创建的),则该 View 不是此处调用其 simulation()
方法的 View 。
如果您要在此代码中创建 View ,那么您需要将该 View 添加到您的窗口中。或者,如果您要在 IB 中创建 View ,那么您需要通过 socket 或其他某种方式获取对该 View 的引用,而不是在此处实例化 View 。
关于 swift macOS : Window-Redraw is not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48467310/