Редактировать: Благодаря некоторым отзывам я смог получить эту частично работоспособную (обновленный код, чтобы отразить текущие изменения).
Несмотря на то, что приложение работает как и предполагалось, я все еще получаю предупреждение «Изменение состояния ...». Как я могу обновить чертеж вида в updateUIView
и pu sh новые чертежи в стек с помощью canvasViewDrawingDidChange
, не вызывая этой проблемы? Я попытался обернуть его в диспетчерский вызов, но это просто создает бесконечное число l oop.
Я пытаюсь реализовать функцию отмены в 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] Изменение состояния во время обновления представления, это приведет к неопределенному поведению.
Предположительно, это вызвано моим координатор изменил функцию, но я не уверен, как это исправить. Как лучше всего подойти к этому?
Спасибо!