SwiftUI将从根视图推送的详细信息视图显示为初始应用程序视图

问题描述

我有两个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
            }
    }
}
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...