SwiftUI List编辑,拖动、删除、横滑

研究了一下SwiftUI的List。使用自带的编辑模式能简便的实现很多功能。
主要涉及:

  • onDrag
  • onMove
  • onDelete
  • swipeActions

效果如图:
在这里插入图片描述

使用编辑模式

打开编辑模式的环境变量,list就进入到编辑模式中。

.environment(\.editMode, $editMode)

之后添加 onDrag/onMove/onDelete 来实现移动及删除。
示例代码如下:

import SwiftUI

struct DDragList: View {
    @State var datas: [(String,[String])] = [("诗歌", ["黄瓜不只", "是黄瓜", "今天天气", "还是不错的"]),
                                             ("古诗词", ["床前明月光", "疑是地上霜", "举头望明月", "低头思故乡"])]
    @State var editMode: EditMode = .inactive
    var body: some View {
        List {
            ForEach(datas.indices, id: \.self) { index in
                Section(datas[index].0) {
                    var subs = datas[index].1
                    ForEach(subs, id: \.self) { sub in
                        Text(sub)
                            .onDrag {
                                let provider = NSItemProvider.init(object: NSString(string: sub))
                                return provider
                            }
                    }
                    .onMove { fromSet, to in
                        subs.move(fromOffsets: fromSet, toOffset: to)
                        datas[index].1 = subs
                    }
                    .onDelete { indexSet in
                        subs.remove(atOffsets: indexSet)
                        datas[index].1 = subs
                    }
                }
            }
        }
        .environment(\.editMode, $editMode)
        .onAppear {
            editMode = .active
        }
        .onDisappear {
            editMode = .inactive
        }
    }
}

struct DDragList_Previews: PreviewProvider {
    static var previews: some View {
        DDragList()
    }
}

使用swipeAction

不进入List编辑模式,通过横滑列表项展示编辑按钮方式来实现编辑List。
swipeAction中的content需要是Button

.swipeActions(edge: .trailing, allowsFullSwipe: true) {Button()}

示例代码如下:

import SwiftUI

struct DDragListSwipeAction: View {
    @State var datas: [(String,[String])] = [("诗歌", ["黄瓜不只", "是黄瓜", "今天天气", "还是不错的"]),
                                             ("古诗词", ["床前明月光", "疑是地上霜", "举头望明月", "低头思故乡"])]
    var body: some View {
        List {
            ForEach(datas.indices, id: \.self) { index in
                Section(datas[index].0) {
                    var subs = datas[index].1
                    ForEach(subs, id: \.self) { sub in
                        Text(sub)
                            .onDrag {
                                let provider = NSItemProvider.init(object: NSString(string: sub))
                                return provider
                            }
                            .swipeActions(edge: .trailing, allowsFullSwipe: true) {
                                Button {
                                    let offset = subs.firstIndex(of: sub)
                                    subs.remove(at: offset!)
                                    datas[index].1 = subs
                                } label: {
                                    Image(systemName: "trash")
                                }
                                .tint(.red)
                                
                                Button {
                                    print("edit")
                                } label: {
                                    Image(systemName: "square.and.pencil")
                                }
                                .tint(.orange)
                            }
                    }
                    .onMove { fromSet, to in
                        subs.move(fromOffsets: fromSet, toOffset: to)
                        datas[index].1 = subs
                    }
                }
            }
        }
    }
}

struct DDragListSwipeAction_Previews: PreviewProvider {
    static var previews: some View {
        DDragListSwipeAction()
    }
}

示例工程

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xyccstudio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值