我有一个简单的List,其中包含存储在ObservableObject中的部分。我想从另一个角度重新点菜。
这是我的密码:
class ViewModel: ObservableObject {
@Published var sections = ["S1", "S2", "S3", "S4"]
func move(from source: IndexSet, to destination: Int) {
sections.move(fromOffsets: source, toOffset: destination)
}
}struct ContentView: View {
@ObservedObject var viewModel = ViewModel()
@State var showOrderingView = false
var body: some View {
VStack {
Button("Reorder sections") {
self.showOrderingView = true
}
list
}
.sheet(isPresented: $showOrderingView) {
OrderingView(viewModel: self.viewModel)
}
}
var list: some View {
List {
ForEach(viewModel.sections, id: \.self) { section in
Section(header: Text(section)) {
ForEach(0 ..< 3, id: \.self) { _ in
Text("Item")
}
}
}
}
}
}struct OrderingView: View {
@ObservedObject var viewModel: ViewModel
var body: some View {
NavigationView {
List {
ForEach(viewModel.sections, id: \.self) { section in
Text(section)
}
.onMove(perform: viewModel.move)
}
.navigationBarItems(trailing: EditButton())
}
}
}但是在OrderingView中,当我试图移动部分时,我得到了一个错误:“尝试为单元格创建两个动画”。很可能是因为章节的顺序发生了变化。
我怎样才能改变各节的顺序?
发布于 2020-07-20 15:37:28
-- SwiftUI 1.0的一个可能的解决方案
我找到了一个通过添加List来禁用.id(UUID())动画的解决方法
var list: some View {
List {
...
}
.id(UUID())
}然而,这会破坏用NavigationLink(destination:tag:selection:):Transition animation gone when presenting a NavigationLink in SwiftUI创建的NavigationLink(destination:tag:selection:):Transition animation gone when presenting a NavigationLink in SwiftUI创建的转换动画。
所有其他动画(如onDelete)也不见了。
更麻烦的解决方案是有条件地禁用列表动画:
class ViewModel: ObservableObject {
...
@Published var isReorderingSections = false
...
}struct OrderingView: View {
@ObservedObject var viewModel: ViewModel
var body: some View {
NavigationView {
...
}
.onAppear {
self.viewModel.isReorderingSections = true
}
.onDisappear {
self.viewModel.isReorderingSections = false
}
}
}struct ContentView: View {
...
var list: some View {
List {
...
}
.id(viewModel.isReorderingSections ? UUID().hashValue : 1)
}
}https://stackoverflow.com/questions/62996572
复制相似问题