.onTapGesture获取Scrollview项目数据

问题描述

我的完整项目在这里https://github.com/m3rtkoksal/TaskManager

我已将SelectedTask设置为如下所示的环境对象

let context = persistentContainer.viewContext
    let contentView = ContentView()
                                    .environmentObject(observer())
                                    .environmentObject(SelectedTask())
                                    .environment(\.managedobjectContext,context)

在TaskElement模型中,我创建了另一个名为SelectedTask的类,如下所示:

class SelectedTask: ObservableObject {
@Published var item = [TaskElement]()

func appendNewTask(task: TaskElement) {
    objectwillChange.send()
    item.append(TaskElement(title: task.title,dateFrom: task.dateFrom,dateto: task.dateto,text: task.text))
   }
 }

我试图在滚动视图中获取一个项目,并获取其数据,以便能够在NewTaskView中对其进行修改,如下所示

struct ScrollViewTask: View {
@Observedobject private var obser = observer()
@EnvironmentObject var selectedTask : SelectedTask
@State var shown: Bool = false
var body: some View {
    
    ScrollView(.vertical) {
        vstack {
            ForEach(self.obser.tasks) { task in
                TaskElementView(task:task)
                    .onTapGesture {
                        self.selectedTask.objectwillChange.send()
                        self.selectedTask.appendNewTask(task: task) //THREAD 1 ERROR
                        print(task)
                        self.shown.toggle()
                    }
            }
        }
    }
    .onAppear {
        self.obser.fetchData()
    }
    .fullScreenCover(isPresented: $shown,content: {
        NewTaskView(isShown: $shown)
            .environmentObject(selectedTask)
      })
    }
   }

但是当我在滚动视图中点击其中一个项目时,出现了线程1错误@ self.selectedTask.appendNewTask(task: task)

线程1:致命错误:找不到类型为SelectedTask的ObservableObject。作为此视图的祖先,可能缺少用于SelectedTask的View.environmentObject(_:)。

如果我更改为ScrollViewTask()。environmentObject(self.obser)

然后发生这种情况

enter image description here

这就是我的TaskFrameView的调用方式

import SwiftUI

struct TaskListView: View {
@State private(set) var data = ""
@State var isSettings: Bool = false
@State var isSaved: Bool = false
@State var shown: Bool = false
@State var selectedTask = TaskElement(title: "",dateFrom: "",dateto: "",text: "")
var body: some View {
    NavigationView {
        ZStack {
            Color(#colorLiteral(red: 0.9333333333,green: 0.9450980392,blue: 0.9882352941,alpha: 1)).edgesIgnoringSafeArea(.all)
            vstack {
                TopBar()
                HStack {...}
                CustomSegmentedView()
                ZStack {
                    TaskFrameView() // scrollview inside
                    vstack {
                        Spacer()
                        HStack {...}
                    }
                    NavigationLink(
                        destination: NewTaskView(isShown: $shown).environmentObject(selectedTask),isActive: $shown,label: {
                            Text("")
                        })
                }
            }
        }
        .navigationBarHidden(true)
        Spacer()
    }
    .navigationBarHidden(true)
     }
    }

解决方法

似乎selectedTask没有注入到TaskListView中。

找到您呼叫TaskListView()的地方,并将selectedTask注入为EnvironmentObject

在ContentView中:

struct ContentView: View {
    @EnvironmentObject var selectedTask : SelectedTask
    ...
TaskListView().environmentObject(selectedTask)

也不要创建selectedTask的新实例,例如:

@State var selectedTask = TaskElement(title: "",dateFrom: "",dateTo: "",text: "")

相反,从环境中获取已创建的实例:

@EnvironmentObject var selectedTask: SelectedTask
,

通过发送观察者对象作为环境对象修饰符来调用滚动视图 ScrollViewTask()。environmentObject(自身观察者)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...