【问题标题】:SwiftUI: List error Cannot call value of non-function type 'Binding<Subject>'SwiftUI:列表错误无法调用非函数类型'Binding<Subject>'的值
【发布时间】:2020-10-23 19:22:19
【问题描述】:

我正在尝试在列表中添加“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) }
            }
        }
    }

你们中的任何人都知道为什么或如何解决此错误以便能够使用onMoveonDelete 函数吗?

非常感谢您的帮助。

【问题讨论】:

    标签: ios swift swiftui swiftui-list xcode12


    【解决方案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) }
        }
    }
    

    可以这样解决(在答案的第二部分中仍然提到了问题):

    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) }
            }
        }
    }
    

    第二个问题

    当您拨打move(fromOffsets:toOffset:) 时,您必须拨打MutableCollection,例如数组。你在一个对象的绑定上调用它。

    也许你的意思是:

    self.$itemsStore.move(fromOffsets: $0, toOffset: $1)
    

    类似:

    self.itemsStore.task.move(fromOffsets: $0, toOffset: $1)
    

    【讨论】:

    • 即使我做出了您建议的更改,我仍然收到此错误Cannot call value of non-function type 'Binding&lt;Subject&gt;' 我认为是因为我正在使用'@ObservedObject var itemsStore = TaskStore()'
    • @user2924482 你看到答案的第二部分了吗?我认为那会解决它。这不是您在这里遇到的一个问题
    • @ObservedObject var itemsStore = TaskStore()如何转换成MutableCollection
    • @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.onDeleteForEach 动态容器的修饰符,所以应该在那里应用,并通过引用放置相应的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多