【问题标题】:how to remove delete button in SwiftUI List rows when in Edit Mode?如何在编辑模式下删除 SwiftUI 列表行中的删除按钮?
【发布时间】:2019-11-07 02:26:07
【问题描述】:

在编辑模式下如何删除 SwiftUI 列表行中的删除按钮?请注意,允许对行重新排序的行右侧的汉堡包按钮需要继续起作用。

背景 - 想要一个始终启用“重新排序”行功能的列表。编辑模式似乎可以启用此功能(即,让列表处于编辑模式),但不希望每一行都有红色的删除按钮。

这是一个 SwiftUI 特定的问题。

编辑:仅在此处删除删除按钮后,滑动删除仍然有效...

【问题讨论】:

标签: swiftui swiftui-list


【解决方案1】:

有一个修饰符,只需添加'.deleteDisabled(true)'。您还可以将变量传递给它,从而有条件地禁用删除。

【讨论】:

  • 我实际上只是在寻找如何删除删除按钮,所以向左滑动删除仍然可以工作 - 如果可能的话?
  • 我相信这是不可能的(在 SwiftUI 和 UIKit 中),因为滑动删除手势在编辑模式下被禁用,不会干扰拖动。红色减号按钮可以替代滑动手势。您可以在编辑模式下禁用 delte,否则将其保留为选项。
【解决方案2】:

Xcode 11.2、Swift 5.1 只是不要在 List 中提供 onDelete 并且不会有删除按钮

这里是例子

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()
    }
}

替代方法(有限制)

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!)
    }
}

【讨论】:

  • 我实际上只是在寻找如何删除删除按钮,所以向左滑动删除仍然可以工作 - 如果可能的话?
  • 我找到了这种方法,它可以提供您想要的视觉行为,但是......有一些限制 - 阅读代码 cmets
  • 嗨@Asperi,这种方法仍然适合你吗?我在运行时尝试过,但没有成功。还尝试了新的 .swipeActions。有什么建议么?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多