[英]SwiftUI NavigationView with List programmatic navigation does not work
[英]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.