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")
            })
        }
    }
}
Другие вопросы по тегам