如何在使用Swift 4的Mac OS X上使用NSNDOManager为NSBezierPath添加撤消?

如何在使用Swift 4的Mac OS X上使用NSNDOManager为NSBezierPath添加撤消?,swift,undo,nsundomanager,Swift,Undo,Nsundomanager,我正在尝试为NSBezierPath添加撤消功能 此函数使用半径为45的NSBezierPath绘制圆。以鼠标位置为圆心 然后在CAShapeLayer上绘制NSBezierPath并添加到NSViewController的视图中 如何为该方法添加撤消功能。 先谢谢你 func bezierPathMouseUndoTest(mouseLocation: CGPoint, color: NSColor) { let frame = CGRect(x: CGFloat(0), y: CG

我正在尝试为NSBezierPath添加撤消功能

此函数使用半径为45的NSBezierPath绘制圆。以鼠标位置为圆心

然后在CAShapeLayer上绘制NSBezierPath并添加到NSViewController的视图中

如何为该方法添加撤消功能。 先谢谢你

func bezierPathMouseUndoTest(mouseLocation: CGPoint, color: NSColor) {

    let frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(100), height: CGFloat(100))

    // The path should be the entire circle.
    let circlePath = NSBezierPath.init()
    circlePath.appendArc(withCenter: CGPoint(x: mouseLocation.x, y: mouseLocation.y), radius: (frame.size.width - 10)/2, startAngle: CGFloat(90.0), endAngle: CGFloat(-270.0), clockwise: true) // start from up

    // Setup the CAShapeLayer with the path, colors, and line width
    circleLayer = CAShapeLayer()

    circleLayer.path = circlePath.CGPath

    circleLayer.fillColor = NSColor.clear.cgColor
    circleLayer.strokeColor = color.cgColor
    circleLayer.lineWidth = 5.0;

    circleLayer.strokeEnd = 1.0
    circleLayer.frame = frame

    // Add the circleLayer to the view's layer's sublayers
    self.view.layer?.addSublayer(circleLayer)
    self.undoManager?.setActionName("Draw Bezier Path")

}
谢谢你,威勒克

我添加了撤销功能,使用另外两个函数将bezierPath添加到新层。并稍微修改了上面的代码

将“self.view.layer?.addSublayer(circleLayer)”替换为 “self.addSublayer(层:circleLayer)”

删除“self.undoManager?.setActionName(“绘制贝塞尔路径”)”

在下面添加两个函数

func addSublayer(layer: CALayer) {
    undoManager?.registerUndo(withTarget: self, selector: #selector(removeSublayer), object: layer)
    self.undoManager?.setActionName("Draw Bezier Path")
    self.view.layer?.addSublayer(layer)

}

func removeSublayer(layer: CALayer) {
    undoManager?.registerUndo(withTarget: self, selector: #selector(addSublayer), object: layer)
    layer.removeFromSuperlayer()
}

你尝试过什么吗?我正在尝试先撤消“addSublayer(circleLayer)”。但我不知道怎么做。有什么建议吗?请阅读文档。