swiftui - 如何删除 SwiftUI 动态列表中的复杂项目?

标签 swiftui swiftui-list

我正在尝试为元素列表实现删除功能,但 onDelete 事件无法按预期工作。

代码如下:

    
    @ObservedObject var dm: DataManager = DataManager.shared
    @State var isAddShown = false
    
    var body: some View {
        NavigationView {
            VStack {
                List($dm.TTDItemList) { $item in
                    VStack(alignment: .leading) {
                        TextEditor(text: $item.itemDesc)
                            .onTapGesture {}
                        Text(item.ItemTagsToText())
                            .font(.caption)
                            .foregroundColor(Color.red)
                            .multilineTextAlignment(.leading)
                    }
                    
                }
                .onDelete(perform: cancella)
            }
            .onTapGesture { hideKeyboardAndSave() }

            .navigationBarTitle(Text("Board"), displayMode: .inline)
            .navigationBarItems(trailing:
                                    Button(action: { withAnimation { self.isAddShown.toggle() } }) {
                Image(systemName: !isAddShown ? "plus.circle.fill" : "minus.circle.fill").imageScale(.large)
            }
            )
        }
    }
    
    private func hideKeyboardAndSave() {
        UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
        dm.salva()
    }
    
    func cancella(at offset: IndexSet) {
        guard let intindex = Array(offset).first else { return }
        dm.TTDItemList.remove(at: intindex)
        dm.salva()
    }
    
    
}

我收到的错误是:

Value of type 'List<Never, ForEach<LazyMapSequence<Array.Indices, (Array.Index, UUID)>, UUID, VStack<TupleView<(some View, some View)>>>>' (aka 'List<Never, ForEach<LazyMapSequence<Range, (Int, UUID)>, UUID, VStack<TupleView<(some View, some View)>>>>') has no member 'onDelete'

实现列表很棘手,但代码似乎可以工作,允许将修改保存在数据管理器中。

最佳答案

The onDelete modifier is a method of ForEach. 。它没有为其他View(例如List)定义。您需要修改代码以在 List 中使用 ForEach

            List {
                ForEach($dm.TTDItemList) { $item in
                    VStack(alignment: .leading) {
                        TextEditor(text: $item.itemDesc)
                            .onTapGesture {}
                        Text(item.ItemTagsToText())
                            .font(.caption)
                            .foregroundColor(Color.red)
                            .multilineTextAlignment(.leading)
                    }
                    
                }
                .onDelete(perform: cancella)
            }

从技术上讲,onDeleteDynamicViewContent 协议(protocol)的扩展方法,但唯一符合 DynamicViewContent 的类型是 ForEach 以及 ForEach 的修改衍生品。

关于swiftui - 如何删除 SwiftUI 动态列表中的复杂项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69286062/

相关文章:

swiftui - 将 View 固定到屏幕底部并忽略底部安全区域

swiftui - 使用 SwiftUI 将 InputAccessoryView/View 固定到键盘

swift - 如果列表顺序更改,SwiftUI NavigationView 中的选择会丢失

swift - 是否可以在 SwiftUI 中突出显示鼠标悬停时的行

带有 Xcode 11 beta 7 的 SwiftUI 不更新 List/ForEach 的内容

ios - 使用 SwiftUI 以编程方式发送 SMS

SwiftUI:onDelete 无法正确更新 UI

swiftui - 使用 NavigationLink 将信息传递到另一个 View

swift - 如何在SwiftUI中使用.refreshable调用API并刷新列表

ios - SwiftUI - 如何将 EnvironmentObject 传递给 View 模型?