SwiftUI: ошибка списка не может вызвать значение нефункционального типа ‘Привязка ‘

#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() как можно преобразовать в a MutableCollection ?

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 динамического контейнера, поэтому их следует применять там и помещать соответствующие функции по ссылке.