gpt4 book ai didi

ios - 拖放以在列表 SwiftUI 中移动行

转载 作者:可可西里 更新时间:2023-11-01 01:47:38 24 4
gpt4 key购买 nike

我在 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 协议(protocol)中可用,该协议(protocol)由 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))

关于ios - 拖放以在列表 SwiftUI 中移动行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57081183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com