SwiftUI на Mac Catalyst - список редактирования с ползунком
У меня есть слайдер в списке:
Включаю режим редактирования перемещения:
.onMove { source, destination in
// ...
}
Но теперь я не могу переместить ползунок...
А пока я отключаю ход вот так:
.moveDisabled({
#if targetEnvironment(macCatalyst)
return true
#else
return false
#endif
}())
Это удаляет все функции перемещения... Я только хочу отключить перетаскивание.
Есть ли способ прочитать состояние кнопки редактирования? Чтобы динамически изменять.moveDisabled(...)
?
Обновление: решено!
Я добавил переменную окружения editMode
:
@Environment(\.editMode) var editMode
Потом подключил вот так:
.moveDisabled(editMode?.wrappedValue == .active ? false : true)
Спасибо, @Asperi!
1 ответ
Я рекомендую управлять режимом редактирования вручную, чтобы иметь возможность отслеживать его реальное состояние. См. Ниже в коде идею, как это сделать. Код упрощен, без реальных действий и т. Д., Просто для демонстрации того, как отключить перемещение в.active
режим редактирования.
Примечание: по умолчанию @Environment(\.editMode)
не работает для этой цели, по крайней мере, в моем Xcode 11.2. Таким образом, он установлен как привязка к локальному состоянию, поэтому он отслеживается и с помощью List, и с нашим кодом.
struct TestEditWithSliderInList: View {
@State var value = Array(repeating: 0.0, count: 5)
@State var editMode: EditMode = .inactive
var body: some View {
NavigationView {
List {
ForEach(0..<5, id: \.self) { i in
HStack {
Text("Slider \(i)")
Slider(value: self.$value[i], in: 0...100)
}
}
.onDelete(perform: {_ in })
.onMove(perform: {(_,_) in })
.moveDisabled(editMode == .active ? false : true)
}
.environment(\.editMode, $editMode)
.navigationBarItems(trailing: Button(action: {
withAnimation {
self.editMode = (self.editMode == .active ? .inactive : .active)
}
}) {
Text(self.editMode == .active ? "Done" : "Edit")
})
}
}
}