Почему вам нужно дважды нажать, чтобы отменить выбор «Элемент 1»? Я делаю что-то неправильно? Если нет, есть ли обходной путь? Это происходит как в симуляторе, так и на моем iPhone.
Шаги:
import SwiftUI
struct ContentView: View {
@State private var selectedItems: Set<Int> = [1]
var body: some View {
NavigationView { // Some apparent solutions do not work inside a NavigationView
List(selection: $selectedItems) {
Text("Item 1").tag(1)
Text("Item 2").tag(2)
Text("Item 3").tag(3)
}.environment(\.editMode, Binding.constant(EditMode.active))
}
}
}





Не знаю почему, но, кажется, это доступ к .environment.
У меня работает классическая переменная @Environment:
struct ContentView: View {
@State private var selectedItems: Set<Int> = [1]
@Environment(\.editMode) var editMode
var body: some View {
List(selection: $selectedItems) {
Text("Item 1").tag(1)
Text("Item 2").tag(2)
Text("Item 3").tag(3)
}
// .environment(\.editMode, Binding.constant(EditMode.active))
// try this instead
.onAppear {
editMode?.wrappedValue = EditMode.active
}
}
}
Проблема, похоже, связана с ScenePhase (активный, неактивный, фоновый). Отсутствующие элементы управления выбором появляются при нажатии кнопки «Домой» и повторном открытии приложения.
кажется, что он должен сначала нарисовать вид, прежде чем он сможет активировать режим редактирования. Так что следовать вашей идее DispatchQueue и, возможно, немного времени задержки может быть хорошо.
Я обнаружил, что вы также можете сохранить исходный .environment(\.editMode, Binding... и установить selectedItems в onAppear с помощью DispatchQueue.main.async. Это предотвращает активацию EditMode в других представлениях (в противном случае вам придется реализовать onDisappear при использовании DispatchQueue).
Лучшее решение: прикрепить onAppear к чему-то внутри списка (ForEach или в данном случае Text) и установить там выбор (без DispatchQueue). Используйте оригинальный .environment(\.editMode, Binding... в списке.
Чтобы предотвратить проблему двойного щелчка, установите выделение в onAppearвнутри в списке:
import SwiftUI
struct ContentView: View {
@State private var selectedItems: Set<Int> = []
var body: some View {
NavigationView { // Some apparent solutions do not work inside a NavigationView
List(selection: $selectedItems) {
Text("Item 1").tag(1)
Text("Item 2").tag(2)
Text("Item 3").tag(3).onAppear() { // onAppear inside the List!
selectedItems = [1]
}
}.environment(\.editMode, Binding.constant(EditMode.active))
}
}
}
Обратите внимание, что этот пример кода устанавливает один и тот же выбор для каждого onAppear. В зависимости от того, как должно вести себя ваше приложение, вам придется изменить его.
К сожалению, это не работает для меня в NavigationView. EditButton работает, но программная установка EditMode не активирует редактирование. С помощью DispatchQueue.main.async это работает, но я не знаю, почему.