#ios #swift #swiftui #swiftui-list #xcode12
#iOS #swift #swiftui #swiftui-список #xcode12
Вопрос:
Я пытаюсь добавить действия ‘onMove’ и ‘OnDelete’ в список, но я получаю эти ошибки:
Вот моя реализация:
@ObservedObject var itemsStore = TaskStore()
var body: some View {
ZStack {
VStack{
List{
ForEach(self.itemsStore.task) { task in
Text(task.todoItem)
}
}.onMove{ self.$itemsStore.move(fromOffsets: $0, toOffset: $1)}
.onDelete{ self.$itemsStore.remove(atOffsets: $0) }
}
}
}
Кто-нибудь из вас знает, почему или как можно исправить эту ошибку, чтобы иметь возможность использовать onMove
и onDelete
функции?
Я буду очень признателен за вашу помощь.
Ответ №1:
1-я проблема
Вам нужно присоединить .onMove
и .onDelete
к ForEach
, а не к List
.
Вот ваш текущий код:
ZStack {
VStack {
List {
ForEach(self.itemsStore.task) { task in
Text(task.todoItem)
}
}
.onMove { self.$itemsStore.move(fromOffsets: $0, toOffset: $1) }
.onDelete { self.$itemsStore.remove(atOffsets: $0) }
}
}
Которое можно исправить следующим образом (все еще есть проблемы, упомянутые во 2-й части ответа):
ZStack {
VStack {
List {
ForEach(self.itemsStore.task) { task in
Text(task.todoItem)
}
.onMove { self.$itemsStore.move(fromOffsets: $0, toOffset: $1) }
.onDelete { self.$itemsStore.remove(atOffsets: $0) }
}
}
}
2-я проблема
При вызове move(fromOffsets:toOffset:)
вы должны вызвать его MutableCollection
, например, в массиве. Вы вызываете его при привязке объекта.
Возможно, вы имели в виду вместо:
self.$itemsStore.move(fromOffsets: $0, toOffset: $1)
Что-то вроде:
self.itemsStore.task.move(fromOffsets: $0, toOffset: $1)
Комментарии:
1. Даже когда я внес предложенные вами изменения, я все равно получаю эту ошибку
Cannot call value of non-function type 'Binding<Subject>'
, я думаю, потому, что я использую ‘@ObservedObject var itemsStore = TaskStore ()’2. @user2924482 Вы видели вторую часть ответа? Я думаю, это решило бы проблему. Это не единственная проблема, с которой вы столкнулись здесь
3.
@ObservedObject var itemsStore = TaskStore()
как можно преобразовать в aMutableCollection
?4. @user2924482
TaskStore
является объектом. Вы должны использовать массив, как я предлагаю.ForEach
Похоже, что вы используете массив.
Ответ №2:
Если я правильно представляю вашу TaskStore
здесь исправленную часть кода
List {
ForEach(self.itemsStore.task) { task in
Text(task.todoItem)
}
.onMove(perform: self.itemsStore.move)
.onDelete(perform: self.itemsStore.remove)
}
.onMove
и .onDelete
являются модификаторами ForEach
динамического контейнера, поэтому их следует применять там и помещать соответствующие функции по ссылке.