.onTapGesture 获取滚动视图项目数据
.onTapGesture Get Scrollview Item Data
我的完整项目在这里https://github.com/m3rtkoksal/TaskManager
我已将 SelectedTask 设为如下环境对象
let context = persistentContainer.viewContext
let contentView = ContentView()
.environmentObject(observer())
.environmentObject(SelectedTask())
.environment(\.managedObjectContext,context)
在我的 TaskElement 模型中,我创建了另一个名为 SelectedTask 的 class,如下所示
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)
然后就这样了
这就是我的 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)
}
}
通过发送观察者对象作为环境对象修饰符来调用滚动视图
ScrollViewTask().environmentObject(self.observer)
看起来 selectedTask
没有注入到 TaskListView
。
找到调用 TaskListView()
的地方,然后将 selectedTask
作为 EnvironmentObject
.
注入
在内容视图中:
struct ContentView: View {
@EnvironmentObject var selectedTask : SelectedTask
...
TaskListView().environmentObject(selectedTask)
也不要创建 selectedTask
的新实例,例如:
@State var selectedTask = TaskElement(title: "", dateFrom: "", dateTo: "", text: "")
改为从环境中获取已创建的实例:
@EnvironmentObject var selectedTask: SelectedTask
我的完整项目在这里https://github.com/m3rtkoksal/TaskManager
我已将 SelectedTask 设为如下环境对象
let context = persistentContainer.viewContext
let contentView = ContentView()
.environmentObject(observer())
.environmentObject(SelectedTask())
.environment(\.managedObjectContext,context)
在我的 TaskElement 模型中,我创建了另一个名为 SelectedTask 的 class,如下所示
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)
然后就这样了
这就是我的 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)
}
}
通过发送观察者对象作为环境对象修饰符来调用滚动视图 ScrollViewTask().environmentObject(self.observer)
看起来 selectedTask
没有注入到 TaskListView
。
找到调用 TaskListView()
的地方,然后将 selectedTask
作为 EnvironmentObject
.
在内容视图中:
struct ContentView: View {
@EnvironmentObject var selectedTask : SelectedTask
...
TaskListView().environmentObject(selectedTask)
也不要创建 selectedTask
的新实例,例如:
@State var selectedTask = TaskElement(title: "", dateFrom: "", dateTo: "", text: "")
改为从环境中获取已创建的实例:
@EnvironmentObject var selectedTask: SelectedTask