fix(worterbuch): blank screen when opening canvas

This commit is contained in:
2025-12-01 15:51:36 +01:00
parent 987d327613
commit b635a7f025
3 changed files with 71 additions and 50 deletions

View File

@@ -29,23 +29,39 @@ struct FieldEditorView: View {
let fieldType: FieldType let fieldType: FieldType
@State private var isRecognizing = false @State private var isRecognizing = false
@State private var viewAppeared = false
var body: some View { var body: some View {
NavigationView { NavigationView {
VStack(spacing: 0) { VStack(spacing: 0) {
// Handwriting canvas // Handwriting canvas
HandwritingCanvasView( if viewAppeared {
drawing: $drawing, HandwritingCanvasView(
onDrawingChanged: { newDrawing in drawing: $drawing,
recognizeHandwriting(newDrawing) onDrawingChanged: { newDrawing in
}, recognizeHandwriting(newDrawing)
isEditable: true },
) isEditable: true
.frame(maxWidth: .infinity) )
.frame(height: 400) .frame(maxWidth: .infinity)
.background(Color(.systemGray6)) .frame(height: 400)
.cornerRadius(12) .background(Color(.systemGray6))
.padding() .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 // Transcribed text section
VStack(alignment: .leading, spacing: 8) { VStack(alignment: .leading, spacing: 8) {

View File

@@ -22,15 +22,8 @@ struct HandwritingCanvasView: UIViewRepresentable {
canvasView.backgroundColor = .clear canvasView.backgroundColor = .clear
canvasView.isUserInteractionEnabled = isEditable canvasView.isUserInteractionEnabled = isEditable
// Use the shared tool picker and show it after a delay // Store canvas in coordinator for later access
DispatchQueue.main.async { context.coordinator.canvasView = canvasView
if isEditable, let window = canvasView.window {
let toolPicker = PKToolPicker.shared(for: window)
toolPicker?.setVisible(true, forFirstResponder: canvasView)
toolPicker?.addObserver(canvasView)
canvasView.becomeFirstResponder()
}
}
return canvasView return canvasView
} }
@@ -41,15 +34,9 @@ struct HandwritingCanvasView: UIViewRepresentable {
} }
canvasView.isUserInteractionEnabled = isEditable canvasView.isUserInteractionEnabled = isEditable
// Ensure tool picker is visible when editable // Set up tool picker when window becomes available
if isEditable { if isEditable && canvasView.window != nil && !context.coordinator.toolPickerSetup {
DispatchQueue.main.async { context.coordinator.setupToolPicker()
if let window = canvasView.window {
let toolPicker = PKToolPicker.shared(for: window)
toolPicker?.setVisible(true, forFirstResponder: canvasView)
canvasView.becomeFirstResponder()
}
}
} }
} }
@@ -60,10 +47,32 @@ struct HandwritingCanvasView: UIViewRepresentable {
class Coordinator: NSObject, PKCanvasViewDelegate { class Coordinator: NSObject, PKCanvasViewDelegate {
var drawing: Binding<PKDrawing> var drawing: Binding<PKDrawing>
var onDrawingChanged: ((PKDrawing) -> Void)? var onDrawingChanged: ((PKDrawing) -> Void)?
var canvasView: PKCanvasView?
var toolPicker: PKToolPicker?
var toolPickerSetup = false
init(drawing: Binding<PKDrawing>, onDrawingChanged: ((PKDrawing) -> Void)?) { init(drawing: Binding<PKDrawing>, onDrawingChanged: ((PKDrawing) -> Void)?) {
self.drawing = drawing self.drawing = drawing
self.onDrawingChanged = onDrawingChanged 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) { func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) {

View File

@@ -9,6 +9,12 @@ import SwiftUI
import PencilKit import PencilKit
import CoreData import CoreData
struct FieldSelection: Identifiable {
let id = UUID()
let entry: VocabularyEntry
let fieldType: FieldType
}
struct VocabularyGridView: View { struct VocabularyGridView: View {
@Environment(\.managedObjectContext) private var viewContext @Environment(\.managedObjectContext) private var viewContext
@FetchRequest( @FetchRequest(
@@ -18,13 +24,7 @@ struct VocabularyGridView: View {
private var entries: FetchedResults<VocabularyEntry> private var entries: FetchedResults<VocabularyEntry>
@State private var searchText = "" @State private var searchText = ""
@State private var selectedEntry: VocabularyEntry? @State private var fieldSelection: FieldSelection?
@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 = ""
var filteredEntries: [VocabularyEntry] { var filteredEntries: [VocabularyEntry] {
if searchText.isEmpty { if searchText.isEmpty {
@@ -111,16 +111,14 @@ struct VocabularyGridView: View {
} }
} }
} }
.sheet(isPresented: $showingFieldEditor) { .sheet(item: $fieldSelection) { selection in
if let entry = selectedEntry, let fieldType = selectedFieldType { FieldEditorView(
FieldEditorView( drawing: bindingForDrawing(entry: selection.entry, fieldType: selection.fieldType),
drawing: bindingForDrawing(entry: entry, fieldType: fieldType), text: bindingForText(entry: selection.entry, fieldType: selection.fieldType),
text: bindingForText(entry: entry, fieldType: fieldType), fieldType: selection.fieldType
fieldType: fieldType )
) .onDisappear {
.onDisappear { saveContext()
saveContext()
}
} }
} }
} }
@@ -128,9 +126,7 @@ struct VocabularyGridView: View {
} }
private func openFieldEditor(for entry: VocabularyEntry, fieldType: FieldType) { private func openFieldEditor(for entry: VocabularyEntry, fieldType: FieldType) {
selectedEntry = entry fieldSelection = FieldSelection(entry: entry, fieldType: fieldType)
selectedFieldType = fieldType
showingFieldEditor = true
} }
private func bindingForDrawing(entry: VocabularyEntry, fieldType: FieldType) -> Binding<PKDrawing> { private func bindingForDrawing(entry: VocabularyEntry, fieldType: FieldType) -> Binding<PKDrawing> {