2

初始描述

我目前有一个动态列表,我正在使用 SwiftUI 内置editMode功能和内置功能,EditButton()以便让用户从列表中删除项目。

对于删除部分,我正在使用onDelete添加尾随红色删除滑动手势的修饰符,就像你现在一样。

这是一个例子:

List {
    ForEach(someList) { someElement in
        Text(someElement.name)
    }
    .onDelete { (indexSet) in }
    .onMove { (source, destination) in }
}
.toolbar {
    ToolbarItem(placement: .navigationBarLeading) {
        EditButton()
    }
}
.environment(\.editMode, $editMode)

目标

现在我还想使用 iOS 15.swipeActions修改器,它允许添加我们自己的自定义前导或尾随滑动手势。

我希望用户也能够通过向右滑动来编辑列表元素,所以我在我的行中添加了一个领先的滑动动作:

Text(someElement.name)
.swipeActions(edge: .leading) {
    Button("Edit") { }
}

按钮操作显然会包含一个允许编辑的代码。

问题

使用.swipeActions修饰符会破坏修饰符的正常行为,editMode尤其是.onDelete修饰符。实际上,使用此设置,我无法再向左滑动以删除该行。

那么问题来了:如何在列表中使用 SwiftUIeditMode.onDelete修饰符以及我自己的自定义leading滑动操作?

最小的可重现示例

Xcode 游乐场,适用于 iOS 15。

import SwiftUI
import PlaygroundSupport

struct SomeList: Identifiable {
    let id: UUID = UUID()
    var name: String
}

let someList: [SomeList] = [
    SomeList(name: "row1"),
    SomeList(name: "row2"),
    SomeList(name: "row3")
]

struct ContentView: View {
    @State private var editMode = EditMode.inactive
    
    var body: some View {
        NavigationView {
            List {
                ForEach(someList) { someElement in
                    Text(someElement.name)
                    .swipeActions(edge: .leading) {
                        Button("Edit") { }
                    }
                }
                .onDelete { (indexSet) in }
                .onMove { (source, destination) in }
            }
            .toolbar {
                ToolbarItem(placement: .navigationBarLeading) {
                    EditButton()
                }
            }
            .environment(\.editMode, $editMode)
        }
    }
}

PlaygroundPage.current.setLiveView(ContentView())

您可以测试以下内容:如果您评论或删除此部分:

.swipeActions(edge: .leading) {
    Button("Edit") { }
}

然后.onDelete修改器再次起作用。将其重新打开会破坏该.onDelete功能。

附加信息

因为我使用了修饰符,所以我正在为iOS 15构建这个应用程序。.swipeActions

我愿意接受任何可以实现我的目标的解决方案,即让用户向左滑动以删除行并向右滑动以触发任何版本代码。即使这意味着使用修饰符的另一种方式,或者SwiftUI.swipeActions的修饰符的另一种方式,或者两者兼而有之。.onDeleteeditMode

因为这个修改器,我不得不为 iOS 15 构建应用程序.swipeActions,所以如果我可以为较低的 iOS 版本构建应用程序,那就更好了。

如果您需要任何其他信息,请立即告诉我。谢谢你。

4

0 回答 0