【问题标题】:SwiftUI tab view display sheetSwiftUI 选项卡视图显示表
【发布时间】:2023-03-28 21:34:01
【问题描述】:

我是 SwiftUI 的新手,我尝试构建一个选项卡栏,其中包含一个选项卡,该选项卡将返回模式(工作表)但不返回视图。在我尝试之后,我发现有时它会起作用,但有时不会。我想在用户关闭模式后将前一个选项卡项设为选定选项卡。但我找不到什么错误。有人向我解释我的代码有什么问题吗?

import SwiftUI
struct ContentView: View {
    @State var isPresenting = false
    @State private var selectedItem = 1
    @State private var oldSelectedItem = 1


    var body: some View {
        TabView(selection: $selectedItem){
            Text("1")
                .tabItem {
                        Image(systemName: "house")
                }.tag(1)
            .onAppear {
                self.oldSelectedItem = self.selectedItem
            }

            Text("")    // I want this to display the sheet.
                .tabItem { Image(systemName: "plus.circle") }
                .tag(2)
            .onAppear {
                self.isPresenting = true
                self.selectedItem = self.oldSelectedItem

            }

            Text("3")
                .tabItem {
                    Image(systemName: "calendar")
                }.tag(3)
            .onAppear {
                self.oldSelectedItem = self.selectedItem
            }
        }
        .sheet(isPresented: $isPresenting) {
            testSheet
        }
        .accentColor(Color.orange)

    
    }
    var testSheet : some View {
        VStack{
            Text("testing")
        }
    }
}

【问题讨论】:

    标签: swiftui swiftui-tabview


    【解决方案1】:

    我假设你想要这个(使用 Xcode 12 / iOS 14 测试)

    struct ContentView: View {
        @State var isPresenting = false
        @State private var selectedItem = 1
        @State private var oldSelectedItem = 1
    
    
        var body: some View {
            TabView(selection: $selectedItem){
                Text("1")
                    .tabItem {
                            Image(systemName: "house")
                    }.tag(1)
    
                Text("")    // I want this to display the sheet.
                    .tabItem { Image(systemName: "plus.circle") }
                    .tag(2)
    
                Text("3")
                    .tabItem {
                        Image(systemName: "calendar")
                    }.tag(3)
            }
         //   .onReceive(Just(selectedItem))  // SwiftUI 1.0 - import Combine for this
            .onChange(of: selectedItem) {    // SwiftUI 2.0 track changes
                    if 2 == selectedItem {
                    self.isPresenting = true
                    } else {
                        self.oldSelectedItem = $0
                    }
                }
            .sheet(isPresented: $isPresenting, onDismiss: {
                    self.selectedItem = self.oldSelectedItem
                }) {
                testSheet
            }
            .accentColor(Color.orange)
    
    
        }
        var testSheet : some View {
            VStack{
                Text("testing")
            }
        }
    }
    

    【讨论】:

    • 它的工作!太感谢了!我还有一个问题,我可以让第二个视图为空而不是Text("")吗?
    • 哇,唯一正确的答案。其他答案有效,但不是 100%。这工作 100% 感谢