Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 斯威夫特:贝塞尔_Swift_Macos_Drawing_Nsview_Nsbezierpath - Fatal编程技术网

Swift 斯威夫特:贝塞尔

Swift 斯威夫特:贝塞尔,swift,macos,drawing,nsview,nsbezierpath,Swift,Macos,Drawing,Nsview,Nsbezierpath,这是自定义视图类中的代码: func drawTestingPoint(_ point: CGPoint, target: Int, output: Int) { let path = NSBezierPath() path.appendArc(withCenter: point, radius: 5, startAngle: 0, endAngle: 360) NSColor.black.setStroke() if target == output {

这是自定义视图类中的代码:

func drawTestingPoint(_ point: CGPoint, target: Int, output: Int) {
    let path = NSBezierPath()
    path.appendArc(withCenter: point, radius: 5, startAngle: 0, endAngle: 360)
    NSColor.black.setStroke()
    if target == output {
        NSColor.green.setFill()
    } else {
        NSColor.red.setFill()
    }
    path.lineWidth = 3
    path.fill()
    path.stroke()
}

override func draw(_ dirtyRect: NSRect) {
    //If I call the drawTestingPoint function here it works
}
在my
NSViewController
类中的my
viewDidLoad
方法中,我设置自定义视图并尝试绘制测试点:

let size = getDataViewSize()
let origin = CGPoint(x: view.frame.width/2-size.width/2, y: view.frame.height/2-size.height/2)
dataView = DataView(frame: CGRect(origin: origin, size: size))
view.addSubview(dataView)
dataView.drawTestingPoint(CGPoint(x: view.frame.width/2 y: view.frame.height/2), target: target, output: output)
dataView.needsDisplay = true

我的问题是,没有一点是被画出来的。我认为我的
drawTestingPoint
函数不会有任何问题,因为当我在我的自定义
NSView
类中的
draw(\udirtyrect:NSRect)
函数中调用它时,它会起作用。我该怎么做才能在我的
viewdiload
函数中调用这个函数你可以在上面的代码片段中看到什么,这样我的点就可以画出来了

你不能在任何时候画。通常情况下,您会设置一个视图,并按照您所做的那样实现
draw(:)
。当需要视图绘制其内容时,系统调用draw方法。在调用
draw(:)
方法之前,它会正确设置绘图上下文,以便在视图内部绘制,如果在视图外部绘制,则会进行剪裁。这是你错过的一点

一般来说,您不应该在视图的
draw(:)
方法之外进行绘制。我很少在
draw(:)
方法之外进行绘图,以至于我不记得要正确设置绘图上下文需要做什么。(公平地说,这些天我主要做iOS开发,我的MacOS已经生锈了。)

所以简单的回答是“不要那样做。”

编辑:
相反,请设置自定义视图以保存绘制自身所需的信息。正如其他人所建议的,当您更改视图时,请在视图上设置
needsDisplay=true
。这将导致系统在下一次通过事件循环时调用视图的
draw(:)
方法

您试图执行的操作不清楚。首先,没有人知道DataView是什么。假设它是NSView的子类,我们仍然不知道它是否是连接到视图控制器的现有NSView对象。我已经在自定义NSView上绘制了一些东西,所以这不是问题所在。是的,你的假设是对的。在将自定义NSView添加到“视图控制器”视图后,我正在尝试在该视图上绘图。因此,如果以后要在NSView中绘图,您建议怎么做?设置
view.needsDisplay=true
。在下一次显示更新过程中,AppKit将调用视图的
drawRect:
方法。我确实调用了
dataView.needsDisplay=true
(我的代码段的最后一行)您需要保存要发送到
drawTestingPoint()
的参数,然后从
drawRect()将它们传递到
drawTestingPoint()
。请参见对我的答案的编辑。我建议让视图保存自己的统计信息,而不是像上面@user1118321建议的那样,让
draw(:)
将参数传递到
drawTestingPoint()