斯威夫特用户界面。呈现从根视图推送的详细视图作为初始应用程序视图

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
            }
    }
}
}