SwiftUI:从工作表导航到新视图

时间:2019-11-09 07:31:14

标签: swiftui

如何从工作表中将新视图推入导航堆栈中。我想显示一个课程列表。在选择其中一个课程时,应打开一个工作表,显示有关该课程的详细信息。从工作表中,应该可以在新的全屏视图中开始课程。

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无法正常工作。我猜这是因为工作表不是Content View的ChildView。这可能就是为什么它不起作用的原因。但是如何实现呢?

2 个答案:

答案 0 :(得分:1)

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

实际上,我不明白为什么在上述情况下您需要一张纸。正如您所描述的那样:

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

因此使用两个导航链接,一个在列表中,一个在详细信息中。这是Apple的本机设计,用于NavigationView / NavigationLink的使用-在不同视图之间导航。

答案 1 :(得分:0)

有点晚了,但是在解决这个问题时出现了这个问题。你的工作表就像它自己的视图控制器堆栈。您不能通过工作表覆盖导航父级,也不应该。看起来您确实在问我在寻找什么,即模拟在工作表中导航的其他苹果应用程序。您只需要在工作表中添加一个额外的 Uri uri = Uri.parse("content://media/external/images/media/1563"); InputStream is = getContentResolver().openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(is); 。这将为您提供一个导航堆栈,用于将其他工作表样式的视图推送到您的第一个工作表中的导航控制器。

(SwiftUI 初学者,措辞可能有误)

NavigationView