首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SwiftUI从另一个视图重新排序列表动态部分

SwiftUI从另一个视图重新排序列表动态部分
EN

Stack Overflow用户
提问于 2020-07-20 13:34:11
回答 2查看 739关注 0票数 3

我有一个简单的List,其中包含存储在ObservableObject中的部分。我想从另一个角度重新点菜。

这是我的密码:

代码语言:javascript
运行
复制
class ViewModel: ObservableObject {
    @Published var sections = ["S1", "S2", "S3", "S4"]
    
    func move(from source: IndexSet, to destination: Int) {
        sections.move(fromOffsets: source, toOffset: destination)
    }
}
代码语言:javascript
运行
复制
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")
                    }
                }
            }
        }
    }
}
代码语言:javascript
运行
复制
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中,当我试图移动部分时,我得到了一个错误:“尝试为单元格创建两个动画”。很可能是因为章节的顺序发生了变化。

我怎样才能改变各节的顺序?

EN

Stack Overflow用户

发布于 2020-07-20 15:37:28

-- SwiftUI 1.0的一个可能的解决方案

我找到了一个通过添加List来禁用.id(UUID())动画的解决方法

代码语言:javascript
运行
复制
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)也不见了。

更麻烦的解决方案是有条件地禁用列表动画:

代码语言:javascript
运行
复制
class ViewModel: ObservableObject {
    ...
    @Published var isReorderingSections = false
    ...
}
代码语言:javascript
运行
复制
struct OrderingView: View {
    @ObservedObject var viewModel: ViewModel

    var body: some View {
        NavigationView {
            ...
        }
        .onAppear {
            self.viewModel.isReorderingSections = true
        }
        .onDisappear {
            self.viewModel.isReorderingSections = false
        }
    }
}
代码语言:javascript
运行
复制
struct ContentView: View {
    ...
    var list: some View {
        List {
            ...
        }
        .id(viewModel.isReorderingSections ? UUID().hashValue : 1)
    }
}
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62996572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档