SwiftUI:列表错误无法调用非函数类型'Binding<Subject>'的值

Posted

技术标签:

【中文标题】SwiftUI:列表错误无法调用非函数类型\'Binding<Subject>\'的值【英文标题】: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 函数吗?

非常感谢您的帮助。

【问题讨论】:

【参考方案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 动态容器的修饰符,所以应该在那里应用,并通过引用放置相应的函数。

【讨论】:

以上是关于SwiftUI:列表错误无法调用非函数类型'Binding<Subject>'的值的主要内容,如果未能解决你的问题,请参考以下文章

错误:无法调用非函数类型的值

Swift 3 错误“无法调用非函数类型 'UITableView!' 的值” [关闭]

Swift 错误:无法调用非函数类型“SKSpriteNode”的值

返回响应中的错误'无法调用非函数类型'NSHTTPURLResponse?'的值与斯威夫特 3

在 SwiftUI 中构建列表视图时出错

无法调用非函数类型“HTTPURLResponse”的值?