From b635a7f025b4dd71b3d3d9a003d0e3295d4b3d59 Mon Sep 17 00:00:00 2001 From: oliverhnat Date: Mon, 1 Dec 2025 15:51:36 +0100 Subject: [PATCH] fix(worterbuch): blank screen when opening canvas --- WorterBuch/FieldEditorView.swift | 40 ++++++++++++++++------- WorterBuch/HandwritingCanvasView.swift | 45 +++++++++++++++----------- WorterBuch/VocabularyGridView.swift | 36 +++++++++------------ 3 files changed, 71 insertions(+), 50 deletions(-) diff --git a/WorterBuch/FieldEditorView.swift b/WorterBuch/FieldEditorView.swift index 681bdfc..baae3c5 100644 --- a/WorterBuch/FieldEditorView.swift +++ b/WorterBuch/FieldEditorView.swift @@ -29,23 +29,39 @@ struct FieldEditorView: View { let fieldType: FieldType @State private var isRecognizing = false + @State private var viewAppeared = false var body: some View { NavigationView { VStack(spacing: 0) { // Handwriting canvas - HandwritingCanvasView( - drawing: $drawing, - onDrawingChanged: { newDrawing in - recognizeHandwriting(newDrawing) - }, - isEditable: true - ) - .frame(maxWidth: .infinity) - .frame(height: 400) - .background(Color(.systemGray6)) - .cornerRadius(12) - .padding() + if viewAppeared { + HandwritingCanvasView( + drawing: $drawing, + onDrawingChanged: { newDrawing in + recognizeHandwriting(newDrawing) + }, + isEditable: true + ) + .frame(maxWidth: .infinity) + .frame(height: 400) + .background(Color(.systemGray6)) + .cornerRadius(12) + .padding() + } else { + // Placeholder while loading + Rectangle() + .fill(Color(.systemGray6)) + .frame(height: 400) + .cornerRadius(12) + .padding() + .onAppear { + // Show canvas after a brief delay to ensure window is ready + DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) { + viewAppeared = true + } + } + } // Transcribed text section VStack(alignment: .leading, spacing: 8) { diff --git a/WorterBuch/HandwritingCanvasView.swift b/WorterBuch/HandwritingCanvasView.swift index 2a77a68..283ff04 100644 --- a/WorterBuch/HandwritingCanvasView.swift +++ b/WorterBuch/HandwritingCanvasView.swift @@ -22,15 +22,8 @@ struct HandwritingCanvasView: UIViewRepresentable { canvasView.backgroundColor = .clear canvasView.isUserInteractionEnabled = isEditable - // Use the shared tool picker and show it after a delay - DispatchQueue.main.async { - if isEditable, let window = canvasView.window { - let toolPicker = PKToolPicker.shared(for: window) - toolPicker?.setVisible(true, forFirstResponder: canvasView) - toolPicker?.addObserver(canvasView) - canvasView.becomeFirstResponder() - } - } + // Store canvas in coordinator for later access + context.coordinator.canvasView = canvasView return canvasView } @@ -41,15 +34,9 @@ struct HandwritingCanvasView: UIViewRepresentable { } canvasView.isUserInteractionEnabled = isEditable - // Ensure tool picker is visible when editable - if isEditable { - DispatchQueue.main.async { - if let window = canvasView.window { - let toolPicker = PKToolPicker.shared(for: window) - toolPicker?.setVisible(true, forFirstResponder: canvasView) - canvasView.becomeFirstResponder() - } - } + // Set up tool picker when window becomes available + if isEditable && canvasView.window != nil && !context.coordinator.toolPickerSetup { + context.coordinator.setupToolPicker() } } @@ -60,10 +47,32 @@ struct HandwritingCanvasView: UIViewRepresentable { class Coordinator: NSObject, PKCanvasViewDelegate { var drawing: Binding var onDrawingChanged: ((PKDrawing) -> Void)? + var canvasView: PKCanvasView? + var toolPicker: PKToolPicker? + var toolPickerSetup = false init(drawing: Binding, onDrawingChanged: ((PKDrawing) -> Void)?) { self.drawing = drawing self.onDrawingChanged = onDrawingChanged + super.init() + // Create a dedicated tool picker instance + self.toolPicker = PKToolPicker() + } + + func setupToolPicker() { + guard let canvasView = canvasView, + let toolPicker = toolPicker, + canvasView.window != nil, + !toolPickerSetup else { + return + } + + toolPickerSetup = true + + // Set visible and add observer immediately + toolPicker.setVisible(true, forFirstResponder: canvasView) + toolPicker.addObserver(canvasView) + canvasView.becomeFirstResponder() } func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) { diff --git a/WorterBuch/VocabularyGridView.swift b/WorterBuch/VocabularyGridView.swift index 09ce7d3..f0f22c7 100644 --- a/WorterBuch/VocabularyGridView.swift +++ b/WorterBuch/VocabularyGridView.swift @@ -9,6 +9,12 @@ import SwiftUI import PencilKit import CoreData +struct FieldSelection: Identifiable { + let id = UUID() + let entry: VocabularyEntry + let fieldType: FieldType +} + struct VocabularyGridView: View { @Environment(\.managedObjectContext) private var viewContext @FetchRequest( @@ -18,13 +24,7 @@ struct VocabularyGridView: View { private var entries: FetchedResults @State private var searchText = "" - @State private var selectedEntry: VocabularyEntry? - @State private var selectedFieldType: FieldType? - @State private var showingFieldEditor = false - - // Temporary bindings for editing - @State private var editingDrawing: PKDrawing = PKDrawing() - @State private var editingText: String = "" + @State private var fieldSelection: FieldSelection? var filteredEntries: [VocabularyEntry] { if searchText.isEmpty { @@ -111,16 +111,14 @@ struct VocabularyGridView: View { } } } - .sheet(isPresented: $showingFieldEditor) { - if let entry = selectedEntry, let fieldType = selectedFieldType { - FieldEditorView( - drawing: bindingForDrawing(entry: entry, fieldType: fieldType), - text: bindingForText(entry: entry, fieldType: fieldType), - fieldType: fieldType - ) - .onDisappear { - saveContext() - } + .sheet(item: $fieldSelection) { selection in + FieldEditorView( + drawing: bindingForDrawing(entry: selection.entry, fieldType: selection.fieldType), + text: bindingForText(entry: selection.entry, fieldType: selection.fieldType), + fieldType: selection.fieldType + ) + .onDisappear { + saveContext() } } } @@ -128,9 +126,7 @@ struct VocabularyGridView: View { } private func openFieldEditor(for entry: VocabularyEntry, fieldType: FieldType) { - selectedEntry = entry - selectedFieldType = fieldType - showingFieldEditor = true + fieldSelection = FieldSelection(entry: entry, fieldType: fieldType) } private func bindingForDrawing(entry: VocabularyEntry, fieldType: FieldType) -> Binding {