Я работаю со списком в SwiftUI. Я хочу добавить функцию перетаскивания строк (элементов) в список. В 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))
Спасибо, это работает для меня. Можно ли перемещать элементы, не активируя режим редактирования?
@rraphael Не могли бы вы добавить ссылку на видео WWDC.
@AnjaliKevadiya Я добавил решение для перемещения элементов без кнопки редактирования.
@DimaRostopira где это?
@AndjaliKevadiya последняя строка в ответе: .environment(\.editMode, Binding.constant(EditMode.active))
Вы смотрели какие-нибудь видео WWDC? Например, самый первый из них назывался «Знакомство со SwiftUI: создание вашего первого приложения»? Они демонстрируют то, что я думаю (трудно сказать, ваш дамп кода работает не очень хорошо) вы хотите. developer.apple.com/wwdc19/204 Если это не то, что вы ищете, пожалуйста, вам нужно быть более конкретным. Спасибо и удачи!