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