【问题标题】:Drag and drop to move row in List SwiftUI拖放以在 List SwiftUI 中移动行
【发布时间】:2019-11-26 14:27:21
【问题描述】:

我正在使用 SwiftUI 中的 List。我想在列表中添加拖放行(项目)的功能。在 Swift 中,我们有 UITableView 的 Delegate 和 DataSource 方法,如下所示:

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;

这些方法在 SwiftUI 中的替代方法是什么?

struct User {
    var firstName: String
    var lastName: String
}

struct UserRow: View {
    var user: User

    var body: some View {
        Text("\(user.firstName) \(user.lastName)")
    }
}

struct ContentView : View {
    var body: some View {

        let user1 = User(firstName: "Anjali", lastName: "User1")
        let user2 = User(firstName: "XYZ", lastName: "User2")

        return List {
            UserRow(user: user1)
            UserRow(user: user2)
        }
    }
}

【问题讨论】:

  • 你看过任何 WWDC 视频吗?例如,第一个名为“介绍 SwiftUI:构建你的第一个应用程序”?他们展示了我的想法(很难说,你的代码转储效果不好)你想要的。 developer.apple.com/wwdc19/204 如果这不是你正在寻找的,请你需要更具体。谢谢,祝你好运!

标签: ios swift list swiftui


【解决方案1】:

在 WWDC 中有一个视频简要说明了如何在列表中激活编辑模式以及如何移动项目。

您可以使用onMove 修饰符来处理单元格重新排序,并使用EditButton() 来激活编辑模式,这允许您手动移动单元格。

请注意,您不能在静态列表上使用onMove 方法。该修饰符在DynamicViewContent 协议中可用,由ForEach 实现,但不是由List 实现。

struct ContentView : View {
    let users = [
        User(firstName: "Anjali", lastName: "User1"),
        User(firstName: "XYZ", lastName: "User2")
    ]

    var body: some View {
        NavigationView {
            List {
                ForEach(users.identified(by: \.firstName)) { user in
                    UserRow(user: user)
                }.onMove(perform: move)
            }
            .navigationBarTitle(Text("Users"))
            .navigationBarItems(trailing: EditButton())
        }
    }

    func move(from source: IndexSet, to destination: Int) {
        users.move(fromOffsets: source, toOffset: destination)
    }
}

要使其在没有EditButton 的情况下始终可拖动,只需将此修饰符添加到您的列表中:

.environment(\.editMode, Binding.constant(EditMode.active))

【讨论】:

  • 谢谢,它对我有用。是否可以在不激活编辑模式的情况下移动项目?
  • @rraphael 你介意添加对 WWDC 视频的引用吗?
  • @AnjaliKevadiya 我添加了无需编辑按钮即可移动项目的解决方案
  • @DimaRostopira 它在哪里?
  • @AnjaliKevadiya 最后一行回答:.environment(\.editMode, Binding.constant(EditMode.active))
猜你喜欢
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多