如何在macOS文档应用中用OCR结果更新当前TextEdit视图?
解决方案
当然可以直接覆盖当前视图内容,你的代码问题在于没有正确更新绑定的状态变量,以下是修正步骤和代码:
关键修改点
- 删掉全局变量
a,用@State变量myText直接管理文本状态,全局变量会导致状态不同步,完全没必要用。 - 点击OCR按钮时,直接把OCR返回的结果赋值给
myText;如果需要让文档数据同步更新(方便后续保存),同时也要更新document.text。 - 修复
processed视图的布局问题:SwiftUI的View body只能返回单个视图,多个视图要包裹在VStack里。
修改后的完整代码
// // ContentView.swift // myGrocery // // Created by Erick J Camp on 5/18/23. // import SwiftUI struct ContentView: View { @Binding var document: myGroceryDocument @State var myText = "myTest" // 直接初始化,无需依赖全局变量 var body: some View { HStack{ Button("OCR") { let ocrResult = ocr() myText = ocrResult // 直接更新@State变量,触发视图自动刷新 document.text = ocrResult // 同步更新文档数据,确保保存时能写入正确内容 print(ocrResult) } TextEditor(text: $myText) processed().frame(maxWidth: 200, alignment: .top) } } } struct processed: View { var body: some View { VStack { // 用VStack包裹多个子视图,修复布局失效问题 Text("Hello").frame(alignment: .top) Spacer() } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView(document: .constant(myGroceryDocument())) } } func ocr() -> String { return "this is a test" }
效果说明
点击OCR按钮后,myText会立刻更新,TextEditor会自动刷新显示新的OCR结果;同时document.text同步更新,后续用户保存文档时,OCR结果会被正确写入文件,全程不需要重启应用就能完成内容覆盖。
内容的提问来源于stack exchange,提问作者user3754107
相关产品推荐
相关产品推荐

