首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何移动列表项而不必切换EditMode

如何移动列表项而不必切换EditMode
EN

Stack Overflow用户
提问于 2021-11-22 16:50:54
回答 1查看 677关注 0票数 1

我目前正在SwiftUI中构建一个SwiftUI列表应用程序。我真正想要实现的一个特性是手动排序列表的能力,因此我已经在填充我的.onMove循环中使用ForEach修饰符集成了该功能,但仍然必须手动切换EditMode,因此我将列表的EditMode设置为.active,如下所示:

代码语言:javascript
复制
import SwiftUI

struct ContentView: View {
@State private var items = ["1", "2", "3"]
@State var editMode: EditMode = .active

var body: some View {
    List {
        ForEach(items, id: \.self) { item in
            Text("Item \(item)")
        }
        .onMove(perform: { _, _  in })
    }
    .environment(\.editMode, $editMode)
}
}

但是我对这个实现并不满意,因为我仍然需要使用来自EditMode的抓地力,它还破坏了SwipeActions和Button的功能。

那么,如何在不使用EditMode的情况下移动列表项呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-24 13:26:10

根据Asperi对this问题的回答,我实现了拖拽手势来解决这个问题,如下所示:

代码语言:javascript
复制
struct ContentView: View {

@State var items = [Item(id: 1), Item(id: 2), Item(id: 3), Item(id: 4)]
@State private var dragging: Item?

var body: some View{
    List{
        ForEach(items){ item in
            Text("Item \(item.id)")
                .onDrag {
                    self.dragging = item
                    return NSItemProvider(object: NSString())
                }
                .onDrop(of: [UTType.text], delegate: DragDelegate(current: $dragging))
        }
        .onMove(perform: {_, _  in })
    }
}
}

使用DropDelegate实现:

代码语言:javascript
复制
struct DragDelegate<Item: Equatable>: DropDelegate {
@Binding var current: Item?

func dropUpdated(info: DropInfo) -> DropProposal? {
    DropProposal(operation: .move)
}

func performDrop(info: DropInfo) -> Bool {
    current = nil
    return true
}
}

注意:这些项目现在必须符合Identifiable & Equatable,所以最小的实现是:

代码语言:javascript
复制
struct Item: Identifiable, Equatable{
let id: Int
}

你还需要进口:

代码语言:javascript
复制
import UniformTypeIdentifiers

为了使用拖放功能

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70069484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档