在编辑模式下,如何删除SwiftUI列表行中的“删除”按钮?
在编辑模式下,如何删除SwiftUI列表行中的“删除”按钮?请注意,行右侧允许重新订购行的汉堡按钮需要继续运行 后台-希望列表始终启用“重新排序”行功能。编辑模式似乎启用了此功能(即在编辑模式下保留列表),但不希望每行上都有红色的删除按钮 这是一个特定于SwiftUI的问题 编辑:仅在此处删除删除按钮后,滑动删除仍然有效…Xcode 11.2,Swift 5.1 只要不在列表中提供onDelete,就不会有删除按钮 下面是一个例子在编辑模式下,如何删除SwiftUI列表行中的“删除”按钮?,swiftui,swiftui-list,Swiftui,Swiftui List,在编辑模式下,如何删除SwiftUI列表行中的“删除”按钮?请注意,行右侧允许重新订购行的汉堡按钮需要继续运行 后台-希望列表始终启用“重新排序”行功能。编辑模式似乎启用了此功能(即在编辑模式下保留列表),但不希望每行上都有红色的删除按钮 这是一个特定于SwiftUI的问题 编辑:仅在此处删除删除按钮后,滑动删除仍然有效…Xcode 11.2,Swift 5.1 只要不在列表中提供onDelete,就不会有删除按钮 下面是一个例子 import SwiftUI import Combine s
import SwiftUI
import Combine
struct ContentView: View {
@State private var objects = ["1", "2", "3"]
var body: some View {
NavigationView {
List {
ForEach(objects, id: \.self) { object in
Text("Row \(object)")
}
.onMove(perform: relocate)
}
.navigationBarItems(trailing: EditButton())
}
}
func relocate(from source: IndexSet, to destination: Int) {
objects.move(fromOffsets: source, toOffset: destination)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
替代方法(有限制)
有一个修饰符,只需添加“.deleteDisabled(true)”。您还可以向其中传递一个变量,从而有条件地禁用删除。实际上,我只是想了解如何删除按钮,所以向左滑动以删除仍然可以工作-如果可能的话?我认为这是不可能的(在SwiftUI和UIKit中),因为“滑动以删除”手势在编辑模式下被禁用,不会干扰拖动。红色的减号按钮代替了滑动手势。您可以在编辑模式下禁用delte,并将其作为一个选项保留。实际上,我只是想了解如何删除按钮,所以向左滑动以删除仍然可以工作-如果可能的话?我找到了方法,它可以提供您想要的视觉行为,但是。。。有一些限制-阅读代码commentsHi@Greg,你找到你的问题的解决方案了吗?没有。所以我只是假设暂时不可能。我@Greg,似乎这家伙找到了方法,
struct ContentView: View {
@State private var objects = ["1", "2", "3"]
@Environment(\.editMode) var editMode
var body: some View {
// NavigationView {
VStack {
// !!! A. using NavigationView instead of VStack above does not work,
// !!! because editMode is not updated and always .inactive
// !!! B. Also it does not work in Preview, but works in run-time
EditButton()
List {
ForEach(objects, id: \.self) { object in
Text("Row \(object)")
}
.onMove(perform: relocate)
.onDelete(perform: delete)
.deleteDisabled(disableDelete)
}
// .navigationBarItems(trailing: EditButton())
}
}
var disableDelete: Bool {
if let mode = editMode?.wrappedValue, mode == .active {
return true
}
return false
}
func relocate(from source: IndexSet, to destination: Int) {
objects.move(fromOffsets: source, toOffset: destination)
}
func delete(from source: IndexSet?) {
objects.remove(atOffsets: source!)
}
}