斯威夫特用户界面。呈现从根视图推送的详细视图作为初始应用程序视图
SwiftUI. Present a detail view pushed from the root view as the initial application view
我有两个 SwiftUI 视图,第一个视图有一个导航 link 到第二个视图,我想显示从第一个视图“推出”的第二个视图,作为初始应用程序视图.
这是 iOS 笔记应用程序的行为,用户可以在其中看到笔记列表作为初始视图控制器,并且可以 return 使用后退导航按钮转到文件夹列表。
我可以用 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 and @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
}
}
}
}
我有两个 SwiftUI 视图,第一个视图有一个导航 link 到第二个视图,我想显示从第一个视图“推出”的第二个视图,作为初始应用程序视图.
这是 iOS 笔记应用程序的行为,用户可以在其中看到笔记列表作为初始视图控制器,并且可以 return 使用后退导航按钮转到文件夹列表。
我可以用 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 and @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
}
}
}
}