【问题标题】:SwiftUI: MasterDetailView within in Tabbed View loses "State"SwiftUI:选项卡式视图中的 MasterDetailView 丢失“状态”
【发布时间】:2020-03-07 07:40:43
【问题描述】:

我在选项卡式视图中有一个 MasterDetailView。如果用户选择 MasterDetailView 并在主视图中选择一个条目,则详细信息将显示在详细信息视图中。选择另一个选项卡并切换回 MasterDetailView 后,不再选择详细信息 - MasterDetailView 完全失去其状态,就像完全渲染一样。

private let dateFormatter: DateFormatter = {
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .medium
    dateFormatter.timeStyle = .medium
    return dateFormatter
}()

struct MasterDetailView: View {
    @State private var dates = [Date]()
    var body: some View {
        NavigationView {
            MasterView(dates: $dates)
                .navigationBarTitle(Text("Master"))
                .navigationBarItems(
                    leading: EditButton(),
                    trailing: Button(
                        action: {
                            withAnimation { self.dates.insert(Date(), at: 0) }
                        }
                    ) {
                        Image(systemName: "plus")
                    }
                )
            DetailView()
        }.navigationViewStyle(DoubleColumnNavigationViewStyle())
    }
}

struct MasterView: View {
    @Binding var dates: [Date]

    var body: some View {
        List {
            ForEach(dates, id: \.self) { date in
                NavigationLink(
                    destination: DetailView(selectedDate: date)
                ) {
                    Text("\(date, formatter: dateFormatter)")
                }
            }.onDelete { indices in
                indices.forEach { self.dates.remove(at: $0) }
            }
        }
    }
}

struct DetailView: View {
    var selectedDate: Date?    

    var body: some View {
        Group {
            if selectedDate != nil {
                Text("\(selectedDate!, formatter: dateFormatter)")
            } else {
                Text("Detail view content goes here")
            }
        }.navigationBarTitle(Text("Detail"))
    }
}

struct ContentView: View {      
    @State private var selection = 0
    var body: some View {
        TabView(selection: $selection){
            Text("First View")
                .font(.title)
                .tabItem {
                    VStack {
                        Image("first")
                        Text("First")
                    }
                }
                .tag(0)

            MasterDetailView()
                .tabItem {
                    VStack {
                        Image("second")
                        Text("Master Detail")
                    }
                }
                .tag(1)
        }
    }
}

当用户选择该选项卡时,有没有办法“重用”MasterDetailView?

我知道我可以使用@State 和@Binding 来保存和恢复状态(如主视图中的选定条目),并且在那个简单的示例中可能是一个解决方案。但是在一个复杂的应用程序中——例如,当 MasterDetailView 包含一个深层视图层次结构时——管理(保存和恢复)视图的完整状态是没有用的。

【问题讨论】:

  • 好问题,我刚刚发布了类似的内容。出于同样的原因,这几乎扼杀了我的 SwiftUI。

标签: swiftui master-detail tabbed-view


【解决方案1】:

这个问题的变体已经被问过好几次了,到目前为止,共识是 SwiftUI 还不支持这个用例。我敢肯定它在他们的雷达上,但ask for this feature 的人越多,它就越有可能被优先考虑明年的更新。

这是an answer,有人通过包装 UITabBarController 以与 SwiftUI 一起使用,从而获得了您想要的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 2023-03-28
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多