swift macOS : Window-Redraw is not working

标签 swift macos redraw

我已经编写了一个带有 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/

相关文章:

macos - 将OpenCV集成到OpenGL应用程序中

c - 移动主窗口位置或弹出消息框后列表框控件未重绘

swift - 如何在ios9中检测两次点击主页按钮

swift - swift hashable 协议(protocol)哈希函数是否需要返回唯一值?

swift - .propertiestofetch 在 Swift 中获取 CoreData 实体中的属性数组

ios - OS X 的 SecRandomCopyBytes 分支安全吗?

ios - 如何在 OS X 或 iOS(不使用 Gestalt)中确定运行时的操作系统版本?

ios - 我的导航栏、警报标题和底部警报标题在整个项目中变成白色

android - 旋转视频搞砸了 MediaControls,android

c++ - Win32 Windows 通过顶部窗口重绘