簡體   English   中英

在列表 SwiftUI 中拖放以移動行

[英]Drag and drop to move row in 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)
        }
    }
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM