1

我在列表中有一个滑块:

图像1

我启用移动编辑模式:

.onMove { source, destination in
    // ...                     
}

img2

但是现在我无法移动滑块...

图像3

现在我禁用这样的移动:

.moveDisabled({
    #if targetEnvironment(macCatalyst)
    return true
    #else
    return false
    #endif
}())

删除了所有移动功能......我只想禁用拖动。

有没有办法读取编辑按钮状态?动态改变.moveDisabled(...)

更新:解决了!

我添加了环境变量editMode

@Environment(\.editMode) var editMode

然后像这样连接它:

.moveDisabled(editMode?.wrappedValue == .active ? false : true)

谢谢@Asperi!

4

1 回答 1

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")
            })
        }
    }
}
于 2019-11-29T16:28:11.947 回答