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
@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) {

View File

@@ -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<PKDrawing>
var onDrawingChanged: ((PKDrawing) -> Void)?
var canvasView: PKCanvasView?
var toolPicker: PKToolPicker?
var toolPickerSetup = false
init(drawing: Binding<PKDrawing>, 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) {

View File

@@ -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<VocabularyEntry>
@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<PKDrawing> {