SwiftUI: 从Sheet导航到新视图

6
如何从 Sheet 中将新视图推送到导航堆栈中。我想显示一个课程列表。当点击其中一节课时,应该打开一个 sheet 显示有关该课程的详细信息。在 sheet 内部,应该能够开始该课程并在新的全屏视图中查看。
import SwiftUI

struct ContentView: View {
    var lessons = [Lesson(id:"1"), Lesson(id:"2"), Lesson(id:"3"), Lesson(id:"4"), Lesson(id:"5"), Lesson(id:"6"), Lesson(id:"7"), Lesson(id:"8"), Lesson(id:"9")]

    var body: some View {
        NavigationView(){
            Form{
                List(lessons){ lesson in
                    LessonButton(lesson: lesson)
                }
            }
        }
    }
}

struct LessonButton:View{
    @State var showSheet = false
    var lesson:Lesson

    var body: some View {
        Button(action:{self.showSheet = true}){
            Text(lesson.name)
        }.sheet(isPresented:$showSheet){
            NavigationLink(destination: Text("reached")){
                Text("start")
            }
        }
    }
}


struct Lesson: Identifiable{
    var id:String
    var name: String{
        "Lesson \(self.id)"
    }
}

然而,NavigationLink 不起作用。我猜测这是因为 Sheet 不是 Content View 的子视图。这可能就是为什么它不起作用的原因。但怎样才能实现呢?


你的问题有点不清楚,你想在哪里展示课程视图?是在表格内作为一个新视图推入导航栈中,还是在父视图后面的表格中展示? - smat88dd
2个回答

3
有点晚了,但在解决问题时遇到了这个问题。您的表格就像它自己的视图控制器堆栈一样运作。您不能通过表单叠加层导航到父级,也不应该这样做。似乎您正在询问我正在寻找的东西,即模拟其他苹果应用程序在表单中导航的功能。您只需要在表单中添加一个额外的NavigationView 。这将为您提供一个导航堆栈,以将其他表单样式的视图推送到您第一个表单中的导航控制器中。
(SwiftUI初学者,措辞可能有误)
import SwiftUI

struct NavigateFromSheet: View {
    var lessons = [Lesson(id:"1"), Lesson(id:"2"), Lesson(id:"3"), Lesson(id:"4"), Lesson(id:"5"), Lesson(id:"6"), Lesson(id:"7"), Lesson(id:"8"), Lesson(id:"9")]

    var body: some View {
        NavigationView(){
            Form {
                List(lessons){ lesson in
                    LessonButton(lesson: lesson)
                }
            }
        }
    }
}

struct LessonButton:View{
    @State var showSheet = false
    var lesson:Lesson

    var body: some View {
        Button(action:{self.showSheet = true}){
            Text(lesson.name)
        }.sheet(isPresented: $showSheet){
            NavigationView {
                VStack {
                    Text("My First Sheet")
                    NavigationLink(destination: Text("reached")){
                        Text("My Second Sheet")
                    }
                }
            }
            
        }
    }
}


struct Lesson: Identifiable{
    var id:String
    var name: String{
        "Lesson \(self.id)"
    }
}

struct NavigateFromSheet_Previews: PreviewProvider {
    static var previews: some View {
        NavigateFromSheet()
    }
}

1

Sheet是模态视图模式,您可以进入并从中返回。

实际上我不明白为什么在描述的情况下需要一个Sheet。如您所述,预期为:

列表 -> 详细信息 -> 课程,

因此,请连续使用两个导航链接,一个在列表中,一个在详细信息中。这是Apple NavigationView / NavigationLink用法的本机设计-从视图到视图的导航。


1
在App Store的“今日”选项卡中,每篇文章都会弹出类似的表格,每个呈现的应用程序都可以通过NavigationLink打开。但我明白你的意思。 - simibac
表格不会从调用它的视图中继承导航视图。您需要使用按钮来实现此功能,或者更改逻辑以转到另一个视图,而不是像Asperi建议的那样使用表格。 - kdion4891

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接