如何允许对不在编辑模式下的 SwiftUI 列表中的行进行重新排序?

Posted

技术标签:

【中文标题】如何允许对不在编辑模式下的 SwiftUI 列表中的行进行重新排序?【英文标题】:How to allow reordering of rows in a SwiftUI List whist NOT in edit mode? 【发布时间】:2019-11-08 11:25:15 【问题描述】:

是否允许对不在编辑模式下的 SwiftUI 列表中的行进行重新排序?

那是给行一个右手边的汉堡菜单图标,他们可以用它来重新排列一行? (就像在编辑模式下可能的那样)

【问题讨论】:

【参考方案1】:

如果我正确理解了您的问题,可以这样做:

import SwiftUI

struct TestEditModeCustomRelocate: View 
    @State private var objects = ["1", "2", "3"]
    @State var editMode: EditMode = .active

    var body: some View 
        List 
            ForEach(objects, id: \.self)  object in
                Text("Row \(object)")
            
            .onMove(perform: relocate)
        
        .environment(\.editMode, $editMode)
    

    func relocate(from source: IndexSet, to destination: Int) 
        objects.move(fromOffsets: source, toOffset: destination)
    


struct TestEditModeCustomRelocate_Previews: PreviewProvider 
    static var previews: some View 
        TestEditModeCustomRelocate()
    

【讨论】:

嗨 - 我认为这是有效的,因为它在编辑模式下是正确的,我正在寻找一种允许一个总是重新排序的方法,所以一种在不编辑时让“onMove”工作的方法模式... EditMode 只是一个状态值,您需要将其设置为本地列表具有行重新排序样式。这些东西是依赖的,没有第一 - 没有第二。另一种方法是编写完全自定义的类似列表的视图。 好的,谢谢 - 所以基本上不可能 - 很高兴知道。我非常喜欢 GoApps (apps.apple.com/us/app/gotasks/id389113399),它的设置就像我所指的那样,并且想知道如何获得它。这样做的 DIY 列表将非常棘手,必须手动拖放事件等? 据我所知,GoApps 使用由“编辑”按钮激活的标准重新排序。如果这是您想要的,那就更简单了 - 只需在任何地方添加 EditButton()。 在 GoApps 的列表视图中,他们似乎设法不显示删除按钮(这是我希望避免的)并将其替换为复选框 - 不确定这是否可能在 SwiftUI 中?

以上是关于如何允许对不在编辑模式下的 SwiftUI 列表中的行进行重新排序?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 如何在编辑模式下避免列表中的行缩进,但不使用 onDelete? (附代码/视频)

SwiftUI - 列表编辑模式 - 如何更改删除按钮标题?

SwiftUI - 如何在编辑模式下更改列表的背景

SwiftUI 如何不在列表中复制 ViewModel

SwiftUI,列表行添加按钮

从 SwiftUI 中的工作表更新列表视图中的行