如何在没有列表的情况下使用滑动操作并使用索引 swiftui

问题描述 投票:0回答:2

我正在制作一个待办事项应用程序,并希望通过滑动来删除每个任务。


ScrollView { 
    ForEach(tasks.indices, id: \.self) { index in
       TextField("Activity here", text: $tasks[index]) 
           .cornerRadius(20)
           .foregroundColor(textColor)
           .background(backgroundColor)
           .padding(.leading, 10)
           .padding(.trailing, 10)
           .padding(.top, 5)
       }
    }.frame(height: 600, alignment: .topLeading)

我尝试过 .onDelete 和 .swipeactions,但不知道如何在没有列表的情况下做到这一点。

swift xcode swiftui
2个回答
0
投票

我认为你必须使用 SwiftUI 的 List 并且你可以使用 onDelete 来删除你的任务 你的代码将是这样的:

  var body: some View {
    ScrollView {
        List{
            
            ForEach(tasks.indices, id: \.self) { index in
                
                TextField("Activity here", text: $tasks[index])
                
                    .cornerRadius(20)
                    .foregroundColor(Color.white)
                    .background(Color.black)
                    .padding(.leading, 10)
                    .padding(.trailing, 10)
                    .padding(.top, 5)
            }
            .onDelete{_ in self.tasks.remove(at: 0)}
        }.frame(height: 600, alignment: .topLeading)
    }
}

但是,如果您决定创建此应用程序,但不是在 SwiftUI 中,我可以为您推荐“SwipeCellKit”cocoapod。 https://github.com/SwipeCellKit/SwipeCellKit/blob/develop/Guides/Advanced.md 使用表格视图,您可以创建这个很酷的应用程序。祝你好运。


0
投票

.swipeactions()
仅适用于
List
,并且直接嵌入
List
中的
ScrollView
不起作用,因为
List
已经可滚动。

当我遇到与您相同的问题时,我需要使用

.swipeactions()
但需要
ScrollView
,因为我还有其他内容要放在
List
之上,我遇到了这个非常有用的 解决方案

它基本上归结为在

VStack
ScrollView
之间添加一个
List
层,并为
List
设置一个足够大的框架,以便只有一个滚动操作:

ScrollView {
    VStack(spacing: 0) {
        
        VStack {
            // Elements you need to show above your List
        }
        
        List {
            // List content here
            ForEach(tasks.indices, id: \.self) { index in
                TextField("Activity here", text: $tasks[index])
                    .cornerRadius(20)
                    .foregroundColor(textColor)
                    .background(backgroundColor)
                    .padding(.leading, 10)
                    .padding(.trailing, 10)
                    .padding(.top, 5)
                    .swipeActions(edge: .leading) {
                        Button(role: .destructive) {
                            // Delete item
                        } label: {
                            Label("Delete", systemImage: "trash")
                        }
                    }
            }
        }
        .frame(height: CGFloat((tasks.count * 75) + (tasks.count < 4 ? 200 : 0)), alignment: .top)
    }
}

如果需要,您可以调整框架的大小以更有效地适应您的内容。

如果您不需要

List
以上的内容,那么您也可以这样做:

List {
    ForEach(tasks.indices, id: \.self) { index in
        TextField("Activity here", text: $tasks[index])
            .cornerRadius(20)
            .foregroundColor(textColor)
            .background(backgroundColor)
            .padding(.leading, 10)
            .padding(.trailing, 10)
            .padding(.top, 5)
            .swipeActions(edge: .leading) {
                Button(role: .destructive) {
                    // Delete item
                } label: {
                    Label("Delete", systemImage: "trash")
                }
            }
    }
}

希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.