Mac Catalyst 上的 SwiftUI - 使用滑块编辑列表

SwiftUI on Mac Catalyst - Edit List with Slider

我在列表中找到了一个滑块:

我启用移动编辑模式:

.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!

我建议手动管理编辑模式,这样就有可能跟踪它的真实状态。请参阅下面的代码想法如何管理它。代码精简,w/o真实动作等,只是为了演示如何在.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")
            })
        }
    }
}