SwiftUI PencilKit Coordinator for navigation

140 views Asked by At

Rather than selecting from a list, I'm trying to navigate between drawings like a book by using buttons to cycle through, but the canvas doesn't update.

I'm following the great tutorial by DevTechie at https://www.youtube.com/watch?v=amZH2i6l004&list=PLbrKvTeCrFAfoACvHOPWFmDIaKUqBZgEr&index=5

The github repo is at https://github.com/devtechie/DrawingDocuments

Here's my ContentView and my version of the DrawingWrapper. The DrawingWrapper uses a DrawingManager (SwiftUI) to pull from CoreData and the DrawingViewController to define a PKCanvas. I wasn't sure which delegate to use and really struggling understanding how to refresh the canvas.

ContentView

struct ContentView: View {
  @StateObject var manager = DrawingManager()
  @State var addNewShown = false
  @State var pageNumber: Int = 0
  @State var newVar = UUID()
  
  var body: some View {
   VStack{
      Text(manager.docs[pageNumber].name!)
      HStack{
        Button(action:{
          pageNumber -= 1
          newVar = manager.docs[pageNumber].id!
          //desiredDoc = manager.docs[pageNumber]
        }){
          Image(systemName: "chevron.left")
        }
        Spacer()
        Button(action:{
          pageNumber += 1
          newVar = manager.docs[pageNumber].id!
          //desiredDoc = manager.docs[pageNumber]
        }){
          Image(systemName: "chevron.right")
        }
      }
   }
}

DrawingWrapper

struct DrawingWrapper: UIViewControllerRepresentable {
  var manager: DrawingManager
  @Binding var doc: DrawingDoc
  
  typealias UIViewControllerType = DrawingViewController
  
  class Coordinator: NSObject, PKCanvasViewDelegate {
    var parent: DrawingWrapper
    init(_ parent: DrawingWrapper){
      self.parent = parent
    }
    
    func canvasViewDidFinishRendering(_ canvasView: PKCanvasView) {
      if let uiDrawing = canvasView.drawing as? PKDrawing {
        parent.doc.data = uiDrawing.dataRepresentation()
      }
    }
  }
  
  func makeCoordinator() -> Coordinator {
    Coordinator(self)
  }
  
  func makeUIViewController(context: UIViewControllerRepresentableContext<DrawingWrapper>) -> DrawingWrapper.UIViewControllerType {
    let viewController = DrawingViewController()
    viewController.drawingData = doc.data!
    viewController.drawingChanged = {data in
      manager.update(data: data, for: doc.id!)
    }
    viewController.delegate = context.coordinator
    return viewController
  }
  
  func updateUIViewController(_ uiViewController: DrawingViewController, context: UIViewControllerRepresentableContext<DrawingWrapper>) {
    uiViewController.drawingData = doc.data!
  }
}
0

There are 0 answers