【问题标题】:SwiftUI programmatic navigation from within list列表中的 SwiftUI 编程导航
【发布时间】:2020-06-07 17:37:12
【问题描述】:

我的导航要求如下所示:

每个详细信息屏幕都可以导航到下一个和上一个详细信息屏幕。同时,“返回”按钮应始终返回到主列表(而不是之前的详细信息屏幕)。

我正在为如何在 SwiftUI 中实现这一点而苦苦挣扎?

这是我目前所拥有的:

struct ListView: View {
    @State private var currentDetailShown: Int?
    @State private var listItems: [Int] = Array(repeating: 0, count: 10)

    func goToNext() {
        if let idx = self.currentDetailShown {
            self.currentDetailShown = min(self.listItems.count - 1, idx + 1)
        }
    }

    func goToPrev() {
        if let idx = self.currentDetailShown {
            self.currentDetailShown = max(0, idx - 1)
        }
    }

    var body: some View {
        List {
            ForEach(0..<listItems.count) { index in
                NavigationLink(destination: DetailView(goToNext: self.goToNext, goToPrev: self.goToPrev),
                               tag: index,
                               selection: self.$currentDetailShown) {
                    ListItem(score: listItems[index])
                }
                .isDetailLink(false)
                .onTapGesture {
                    self.currentDetailShown = index
                }
            }
        }
    }
}

这段代码的情况是,从第一个详细视图开始,它会移动到下一个详细视图,然后立即跳回列表视图。

我觉得我想多了,或者遗漏了一些明显的东西......

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    您可以导航到可以通过使用可观察对象中的已发布变量单独显示每个详细信息的详细信息视图,而不是导航到列表中的每个细节。这是一个例子

    struct MainView: View{
        @EnvironmentObject var viewModel: ViewModel
    
        var body: some View{
            NavigationView{
                VStack{
                ForEach(self.viewModel.details, id:\.self){ detail in
                    NavigationLink(destination: DetailView(detail: self.viewModel.details.firstIndex(of: detail)!).environmentObject(ViewModel())){
                Text(detail)
                }
            }
            }
        }
        }
    }
    
    class ViewModel: ObservableObject{
        @Published var showingView = 0
        @Published var details = ["detail1", "detail2", "detail3", "detail4", "detail5", "detail6"]
    }
    
    struct DetailView: View{
        @EnvironmentObject var viewModel: ViewModel
        @State var detail: Int
        var body: some View{
            VStack{
            IndivisualDetailView(title: viewModel.details[detail])
    
            Button(action: {
                self.viewModel.showingView -= 1
            }, label: {
                Image(systemName: "chevron.left")
            })
                Button(action: {
                    self.viewModel.showingView += 1
                    print(self.viewModel.showingView)
                }, label: {
                    Image(systemName: "chevron.right")
                })
        }
        }
    }
    struct IndivisualDetailView: View{
        @State var title: String
        var body: some View{
            Text(title)
        }
    }
    

    【讨论】:

    • 非常感谢这个解决方案。我能够得到与您的建议类似的东西。这绝对有效。然而,因为这只是改变了单个细节视图后面的状态,所以没有发生“动画”。您对此有什么建议吗?
    • 你可以使用developer.apple.com/tutorials/swiftui/…中看到的一些过渡
    猜你喜欢
    • 2021-06-17
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多