我在列表中有一个滑块:
我启用了移动编辑模式:
.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!
答案 0 :(得分:1)
我建议手动管理编辑模式,因此有可能跟踪它是真实状态。请在下面的代码提示中查看如何进行管理。该代码已简化,没有实际动作等,仅用于演示如何在.active
编辑模式下禁用移动。
注意:为此,至少在我的Xcode 11.2中,使用默认@Environment(\.editMode)
无效。因此它被设置为绑定到本地状态,因此可以通过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")
})
}
}
}