初始描述
我目前有一个动态列表,并使用SwiftUI内置的editMode
功能和内置的EditButton()
,以便让用户从列表中删除项目。
对于删除部分,我使用onDelete
修饰符,它会添加红色滑动手势的后缀Delete,如您所知。
这是一个例子:
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
修饰符。实际上,在这种设置下,我无法再向左滑动以删除行。
所以问题来了:如何在列表中同时使用SwiftUI editMode
的.onDelete
修饰符和自定义的leading
滑动操作?
最小可重现示例
Xcode Playground,适用于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
修改器。
我愿意接受任何解决方案,以实现我的目标,即允许用户向左滑动以删除行,并向右滑动以触发任何编辑代码。即使这意味着使用另一种方式来使用.swipeActions
修改器,或者使用SwiftUI editMode
的另一种方式来使用.onDelete
修改器,或两者兼而有之。
由于这个.swipeActions
修改器,我只能为iOS 15构建应用程序,所以如果我可以为更低版本的iOS构建应用程序,那就更好了。
如果您需要任何其他信息,请告诉我。谢谢。
.swipeActions()
,你必须实现自己的.onDelete()
操作。你不再免费获得它。 - Yrb.onDelete()
和.swipeActions()
,这始终是如此。一旦您将.swipeActions()
放入您的代码中,它就只适用于iOS 15及以上版本。再次强调,这是开发者的选择。 - Yrb