初始描述
我目前有一个动态列表,我正在使用 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
的修饰符的另一种方式,或者两者兼而有之。.onDelete
editMode
因为这个修改器,我不得不为 iOS 15 构建应用程序.swipeActions
,所以如果我可以为较低的 iOS 版本构建应用程序,那就更好了。
如果您需要任何其他信息,请立即告诉我。谢谢你。