我有一个简单的选项卡:

TabView {
    NavigationView {
        VStack {
            NavigationLink(destination: Text("Detail")) {
                Text("Go to detail")
            }
        }
    }
        .tabItem { Text("First") }
        .tag(0)
    Text("Second View")
        .tabItem { Text("Second") }
        .tag(1)
}

当我转到选项卡1上的详细视图时,切换到选项卡2,然后切换回选项卡1,我假设返回到详细视图(iOS中随处可见的基本UX).相反,它会重置为选项卡1的根视图.

既然SwiftUI看起来不支持这种开箱即用的功能,我该如何解决这个问题呢?

推荐答案

下面是一个简单的示例,说明如何在根目录下保留导航堆栈的状态:

struct ContentView: View {

    var body: some View {

        TabView {

            Text("First tab")
                .tabItem { Image(systemName: "1.square.fill"); Text("First") }
                .tag(0)

            SecondTabView()
                .tabItem { Image(systemName: "2.square.fill"); Text("Second") }
                .tag(1)
        }
    }
}

struct SecondTabView: View {

    private struct ListItem: Identifiable {
        var id = UUID()
        let title: String
    }

    private let items = (1...10).map { ListItem(title: "Item #\($0)") }

    @State var selectedItemIndex: Int? = nil

    var body: some View {

        NavigationView {
            List(self.items.indices) { index in
                NavigationLink(destination:  Text(self.items[index].title),
                               tag: index,
                               selection: self.$selectedItemIndex) {
                    Text(self.items[index].title)
                }
            }
            .navigationBarTitle("Second tab", displayMode: .inline)
        }
    }
}

Swift相关问答推荐

如何禁用MacOS上SwiftUI中按钮周围的聚焦环(或高亮显示)?

在Swift中,是否只有iOS版本超过15才能导入Swift包?

是否可以循环遍历SWIFT子类并访问它们的静态变量S?

NavigationLink和ObservableObject的动画片段

BLE 在 ESP32 和 Iphone 之间发送字符串

根据其属性组合 2 个模型以在 Swift 中创建另一个模型

从一个范围减go 多个范围

如何延迟 swift 属性 didSet 使其每秒只触发一次

在 struct 中的序列和非序列泛型函数之间进行 Select

使用 WrappingHStack 文本溢出到新行

MainActor 隔离可变存储属性为何会出现可发送错误?

单击按钮后的计时器发布者初始化计时器

如何在不阻塞 UI 更新的情况下使用 Swift Concurrency 在后台执行 CPU 密集型任务?

如何使用 Swift/iOS 为人类书写的笔画制作动画?

在 Xcode 中自动实现 Swift 协议方法

如何在 Swift 中将对象归零

使用 Swift 以编程方式自定义 UITableViewCell

swift 3 如何获取明天和昨天的日期(注意特殊情况)新月或新年

如何使用 Swift 将文本文件逐行加载到数组中?

无法将 NSAttributedString.DocumentAttributeKey 类型的值转换为 .DocumentReadingOptionKey