gpt4 book ai didi

swift macOS : Window-Redraw is not working

转载 作者:行者123 更新时间:2023-11-30 11:49:43 31 4
gpt4 key购买 nike

我已经编写了一个带有 NSview 和按钮的窗口。当程序启动时,窗口中会出现一个点。按下按钮后,应该会出现另外三个点,但代码不会重绘窗口。如果我在绘图函数内设置断点,我发现代码仅在绘图函数中第一次停止,并且 setNeedDisplay 函数似乎毫无用处。我还尝试了 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)
}

}

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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com