问题描述
我有两个SwiftUI视图,第一个视图具有指向第二个视图的导航链接,我想显示从第一个视图中“推送”的第二个视图,作为初始应用程序视图。
这是iOS Notes应用程序的行为,用户可以将注释列表作为初始视图控制器,并且可以使用后退导航按钮返回到文件夹列表。
我可以用SwiftUI来实现它吗?
解决方法
这是一个简单的演示。使用Xcode 11.7 / iOS 13.7进行了准备和测试
struct ContentView: View {
@State private var isActive = false
var body: some View {
NavigationView {
NavigationLink(destination: Text("Second View"),isActive: $isActive) {
Text("First View")
}
}
.onAppear { self.isActive = true }
}
}
,
您可以添加另一个状态变量以隐藏第一个视图,直到第二个视图出现在屏幕上。
struct ContentView1: View {
@State private var isActive = false
@State private var showView = false
var body: some View {
NavigationView {
NavigationLink(destination: Text("Second View")
.onAppear {
self.showView = true
},isActive: $isActive) {
if self.showView {
Text("First View")
} else {
EmptyView()
}
}
}
.onAppear {
self.isActive = true
}
}
}
,
正如我在对另一个答案的评论中所提到的,通过将控制第二视图呈现的变量的初始状态设置为true
,您的ContentView
会将第二视图呈现为初始视图。
我已经使用模拟器和设备进行了测试。这似乎可以解决您的问题,并且不会向用户显示从第一个视图到第二个视图的过渡-应用会打开到第二个视图。
struct ContentView: View {
@State private var isActive = true
var body: some View {
NavigationView {
NavigationLink(destination: Text("Second View"),isActive: $isActive) {
Text("First View")
}
}
}
}
,
我根据@Asperi和@Mohammad Rahchamani的答案进行了自己的实现。
此实现允许您甚至从具有多个导航链接的列表进行导航。在SwiftUI 2.0上的Xcode 12上进行了测试。
struct IOSFolderListView: View {
@State var isActive = false
@State var wasViewShown = false
var body: some View {
let list = List {
NavigationLink(destination: Text("SecondView").onAppear {
self.wasViewShown = true
},isActive: $isActive) {
Text("SecondView")
}
NavigationLink(destination: Text("ThirdView")) {
Text("ThirdView")
}
.onAppear {
self.isActive = false
}
}
if wasViewShown {
list.listStyle(GroupedListStyle())
.navigationBarTitle("FirstView")
.navigationBarItems(leading: Image(systemName: "folder.badge.plus"),trailing: Image(systemName: "square.and.pencil"))
} else {
list.opacity(0)
.onAppear {
self.isActive = true
}
}
}
}