拖放以在列表SwiftUI中移动行

时间:2019-07-17 17:18:23

标签: ios swift list swiftui

我正在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)
        }
    }
}

1 个答案:

答案 0 :(得分:0)

在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) {

    }
}