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

Posted

技术标签:

【中文标题】SwiftUI:从工作表导航到新视图【英文标题】:SwiftUI: Navigate from Sheet to a new View 【发布时间】:2019-11-09 07:31:14 【问题描述】:

如何从工作表中将新视图推送到导航堆栈上。我想显示课程列表。在其中一堂课上切换时,应打开一张表,显示该课的详细信息。从工作表中,应该能够以新的全屏视图开始课程。

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 的 ChildView。这可能就是它不起作用的原因。但是如何实现呢?

【问题讨论】:

你的问题有点不清楚你想在哪里显示课程视图;在工作表内作为推送到导航堆栈的新视图,还是在工作表后面的父视图中? 【参考方案1】:

有点晚了,但是在解决这个问题时出现了这个问题。您的工作表就像它自己的视图控制器堆栈一样。您不能通过工作表覆盖导航父级,也不应该。看起来您确实在问我在寻找什么,即模仿其他在工作表中导航的苹果应用程序。您只需要在工作表中添加一个 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()
    

【讨论】:

【参考方案2】:

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

实际上,我不明白您为什么在所描述的场景中需要一张工作表。正如你所描述的那样:

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

因此使用两个导航链接,一个在列表中,一个在详细信息中。这是针对 NavigationView/NavigationLink 使用的原生 Apple 设计 - 从一个视图导航到另一个视图。

【讨论】:

在 App Store 的 Today 标签页中,每篇文章都会弹出一个类似的表格,并且每个展示的应用程序都可以使用 NavigationLink 打开。但我明白你的意思。 工作表不会从调用它的视图继承导航视图。您要么需要使用 Button 来完成此操作,要么更改逻辑以转到另一个视图而不是 Asperi 推荐的工作表。

以上是关于SwiftUI:从工作表导航到新视图的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 如何关闭工作表视图,同时关闭该视图

从 SwiftUI 中的工作表更新列表视图中的行

SwiftUI:关闭第一个工作表时如何显示第二个工作表

如何从导航栏按钮导航到新视图在 SwiftUI 中单击

如何在 SwiftUI 中关闭工作表时刷新视图

SwiftUI 模式表在关闭后重新打开