编辑:感谢一些反馈,我已经能够部分工作(更新代码以反映当前更改)。
即使该应用程序似乎按预期工作,我仍然收到“正在修改状态...”警告。如何更新视图的绘图updateUIView
并将新绘图推送到堆栈canvasViewDrawingDidChange
而不导致此问题?我尝试将它包装在调度调用中,但这只会创建一个无限循环。
我正在尝试在UIViewRepresentable
( PKCanvasView
) 中实现撤消功能。我有一个名为 SwiftUI 的父视图WriterView
,它包含两个按钮和画布。
这是父视图:
struct WriterView: View {
@State var drawings: [PKDrawing] = [PKDrawing()]
var body: some View {
VStack(spacing: 10) {
Button("Clear") {
self.drawings = []
}
Button("Undo") {
if !self.drawings.isEmpty {
self.drawings.removeLast()
}
}
MyCanvas(drawings: $drawings)
}
}
}
这是我如何实现我的UIViewRepresentable
:
struct MyCanvas: UIViewRepresentable {
@Binding var drawings: [PKDrawing]
func makeUIView(context: Context) -> PKCanvasView {
let canvas = PKCanvasView()
canvas.delegate = context.coordinator
return canvas
}
func updateUIView(_ uiView: PKCanvasView, context: Context) {
uiView.drawing = self.drawings.last ?? PKDrawing()
}
func makeCoordinator() -> Coordinator {
Coordinator(self._drawings)
}
class Coordinator: NSObject, PKCanvasViewDelegate {
@Binding drawings: [PKDrawing]
init(_ drawings: Binding<[PKDrawing]>) {
self._drawings = drawings
}
func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) {
drawings.append(canvasView.drawing)
}
}
}
我收到以下错误:
[SwiftUI] 在视图更新期间修改状态,这将导致未定义的行为。
大概是由我的协调员确实改变了功能引起的,但我不确定如何解决这个问题。解决这个问题的最佳方法是什么?
谢谢!