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/

相关文章:

ios - SwiftUI 更改 EditButton 文本颜色

SwiftUI:拖入空列表时崩溃

ios - 如何在 swiftUI 列表中更改复杂数据源

user-interface - 圆角 SwiftUI

ios - ScrollView 内的 SwiftUI 列表

swift - 如何隐藏列表中的空行

ios - SwiftUI 如何在 NavigationView 中强制导航栏分隔线

ios - 列表不异步更新列表中的行数?

autocomplete - 如何使用 ZStack & Geometry 定位列表?

ios - 为什么我的 SwiftUI 列表用相同的项目填充了 4 次而不是所有 4 个项目?