首页 > 解决方案 > 如何在 SwiftUI 的不同视图中保留列表

问题描述

在我的 SwiftUI 应用程序中,我在屏幕底部有选项卡视图。为了保持代码干净,我希望每个选项卡都位于单独的视图/类中。在一个标签中,我有列表。由于某些原因,我无法将列表移动到单独的视图中。这是我的初始代码:导入 SwiftUI

struct ContentView: View {
    var rooms : [Rooms] = []
    @State var selectedView = 1
    var body: some View {
        VStack {
            TabView() {
                List(rooms) { rooms in
                    Image(systemName: "heart.fill")
                    HStack {
                        VStack(alignment: .leading) {
                        Text(rooms.name)
                            .font(.headline)
                        Text("members")
                            .font(.body)
                        }
                    }
                }.tabItem { Image(systemName: "waveform.path.ecg") }.tag(1)


                ExtractedView().tabItem { Text("Tab Label 2") }.tag(2)
            }
        }

    }
}

这就是我尝试制作单独视图的方式:

struct ContentView: View {
    var rooms : [Rooms] = []
    @State var selectedView = 1
    var body: some View {
        VStack {
            TabView() {
                ExtractedView1(rooms: rooms).tabItem { Image(systemName: "waveform.path.ecg") }.tag(1)


                ExtractedView2().tabItem { Text("Tab Label 2") }.tag(2)
            }
        }

    }
}

struct ExtractedView1: View {
    let rooms : Rooms
    var body: some View {
        List(rooms) { rooms in
            Image(systemName: "heart.fill")
            HStack {
                VStack(alignment: .leading) {
                    Text(rooms.name)
                        .font(.headline)
                    Text("members")
                        .font(.body)
                }
            }
        }
    }
}

知道为什么这是错误的吗?我收到以下错误:

错误 1:[Rooms] 不能转换为 Rooms

错误 2:无法推断通用参数“SelectionValue”

如果建议这样做,我什至会将其移至不同的 swift 文件。

标签: swiftswift3swiftuiswiftui-list

解决方案


看起来房间数组[Room]和单个Room对象数据类型之间存在一些混淆。只需确保您使用 List 进行视图以接受一组房间:[Room]以便它可以遍历它们

struct Room: Identifiable {
    let id = UUID()
    let name: String
}

struct ContentView: View {
    var rooms : [Room] = []
    @State var selectedView = 1
    var body: some View {
        VStack {
            TabView() {
                ExtractedView1(rooms: rooms).tabItem { Image(systemName: "waveform.path.ecg") }.tag(1)


                ExtractedView2().tabItem { Text("Tab Label 2") }.tag(2)
            }
        }

    }
}

struct ExtractedView1: View {
    let rooms : [Room]
    var body: some View {
        List(rooms) { room in
            Image(systemName: "heart.fill")
            HStack {
                VStack(alignment: .leading) {
                    Text(room.name)
                        .font(.headline)
                    Text("members")
                        .font(.body)
                }
            }
        }
    }
}

struct ExtractedView2: View {
    var body: some View {
        Text("ExtractedView2")
    }
}

推荐阅读