簡體   English   中英

SwiftUI 列表中的程序化導航

[英]SwiftUI programmatic navigation from within list

我有一個看起來像這樣的導航要求:

導航 每個詳細信息屏幕都可以導航到下一個和上一個詳細信息屏幕。 同時,“返回”按鈕應始終返回主列表(不是前一個詳細屏幕)。

我正在為如何在 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
                }
            }
        }
    }
}

這段代碼發生的情況是,從第一個詳細視圖開始,它將移動到下一個詳細視圖,然后立即跳回列表視圖。

我覺得我想太多了,或者遺漏了一些明顯的東西……

除了導航到列表中的每個細節之外,您還可以導航到可以通過使用可觀察 object 中的已發布變量單獨顯示每個細節的 detailView。 這是一個例子

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)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM