SwiftUI对象的String属性不显示在Text中,如何修改对象内的字符串?
问题1 解决方案
你当前代码中Text(Task(id: 0).taskName)的写法是手动初始化了一个全新的Task实例,并非存储在ModelData中的id为0的原有对象。新实例的taskName会走默认空值,所以无法展示内容。
正确写法是从modelData的tasks数组中筛选出id为0的对象:
// ContentView中替换原有的Text行 if let task0 = modelData.tasks.first(where: { $0.id == 0 }) { Text(task0.taskName) }
问题2 解决方案
你的理解正确,当前写法修改的只是display2里本地@State修饰的副本,不会影响原对象。要修改原对象推荐使用更符合SwiftUI数据流的Binding方案:
- 把
display2的@State改成@Binding
struct display2: View{ @Binding var task:Task // 修改为@Binding,接收外部传入的对象绑定 var body: some View { TextField("New task",text: $task.taskName) } }
- 在ContentView中传递modelData里对应对象的绑定
struct ContentView: View { @EnvironmentObject var modelData: ModelData var body: some View { VStack{ if let index0 = modelData.tasks.firstIndex(where: { $0.id == 0 }) { Text(modelData.tasks[index0].taskName) // 传入对应对象的绑定 display2(task: $modelData.tasks[index0]) } } } }
修改后在display2中对task的操作会直接同步到modelData的原对象上。
内容的提问来源于stack exchange,提问作者swiftNewb
相关产品推荐
相关产品推荐

