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:从工作表导航到新视图的主要内容,如果未能解决你的问题,请参考以下文章