我正在开发一个应用程序,它可以存储多个任天堂控制台及其详细信息(有点像Mactracker,但适用于任天堂的东西).

我想将用户 Select 的控制台存储在主菜单上的Collection 夹类别中,但我无法正确实现.

我有一个主菜单,其中显示了不同的类别以及每个类别复制的最喜欢的类别:

enter image description here

每个Collection 夹"按钮"只会将我带到特定类别(它下面的类别)的Collection 夹,我希望所有Collection 夹都只在一个选项卡中,而不是像目前那样在多个选项卡中.

Collection 夹类别是控制台列表中定义的bool,将在下面列出.

谢谢你的帮助,如果这是一个愚蠢的问题,很抱歉,我对编程很陌生.

主菜单:

struct MainMenu: View {
    // Use categories ordered by alphabetical order
    var categories = ConsoleList.categories.sorted(by: {$0.key < $1.key})
    var body: some View {
        // Loop on categories
        NavigationView{
            List(categories, id:\.key){category in
                // The NavigationLink that takes me to the favorites view
                NavigationLink(destination: Favorites(con: category.value)){
                    Image(systemName: "heart")
                    Text("Favorites")
                        .fontWeight(.semibold)
                }
                NavigationLink(destination: ConsoleMenu(con: category.value), label:{
                    
                    Image(systemName: "folder")
                    
                        .foregroundColor(.red)
                        .scaledToFit()
                        .frame(height: 30)
                        .cornerRadius(4)
                        .padding(.vertical, 4)
                    VStack{
                        Text(category.key)
                            .fontWeight(.semibold)
                    }
                })
            }
            .navigationTitle("")
        }
    }
}

Collection 夹菜单:

struct Favorites: View {
    
    var con: [ConsoleDetails]
    var body: some View {
        
        List(con){ cons in
            if cons.favorites {
                
                NavigationLink(destination: ConsoleDetailView(con: cons), label:{
                    Image(cons.imgName)
                        .resizable()
                        .scaledToFit()
                        .frame(height: 50)
                        .cornerRadius(4)
                        .padding(.vertical, 4)
                        .navigationTitle("\(cons.category)")
                    
                    VStack (alignment: .leading){
                        if cons.category == "Game & Watch" {
                            Text(cons.consoleName)
                                .fontWeight(.semibold)
                            Text(cons.mostSoldGame)
                                .font(.subheadline)
                        }else{
                            Text(cons.consoleName)
                                .fontWeight(.semibold)
                        }
                    }
                }).navigationTitle("Favorites")
            }
        }
    }
}

struct favorites_Previews: PreviewProvider {
    static var previews: some View {
        Favorites(con: ConsoleList.consoles)
    }
}

控制台列表:

struct ConsoleDetails: Identifiable{
    let id = UUID()
    var imgName: String = ""
    var consoleName: String = ""
    var mostSoldGame: String = ""
    var initialPrice: String = ""
    var ReleaseDate: String = ""
    var Discontinuation: String = ""
    var category: String = ""
    var estimatedPricedToday: String = ""
    var cables: String = ""
    var favorites: Bool
}



struct ConsoleList{
    //The consoles list has more consoles usually but I'll only put one to save space
    static var categories = Dictionary(grouping: consoles, by: {$0.category } )
    static var favs = Dictionary(grouping: consoles, by: {$0.favorites} )
    static var consoles = [
        //Current Consoles
        ConsoleDetails(imgName: "NS_OG",
                       consoleName: "Nintendo Switch",
                       mostSoldGame: "Mario Kart 8 Deluxe",
                       initialPrice: "299.99",
                       ReleaseDate: "Mar 3, 2017",
                       Discontinuation: "Still Available",
                       category: "Current Consoles",
                       estimatedPricedToday: "$200-250 used",
                       cables: "HDMI, USB Type-C",
                       favorites: true),

编辑:我已经添加了提议的内容,但我在导航链接中得到了一个错误.见下文:

List{
                Section {
                    // The NavigationLink that takes me to the favorites view
                    NavigationLink {
                        Favorites() // Right Here: Missing argument for parameter 'con' in call
                    } label: {
                        Image(systemName: "heart")
                        Text("Favorites")
                            .fontWeight(.semibold)
                    }
                }
                Section {
                    ForEach(categories, id: \.key){ category in
                        NavigationLink(destination: ConsoleMenu(con: category.value), label:{
                            Image(systemName: "folder")
                                .foregroundColor(.red)
                                .scaledToFit()
                                .frame(height: 30)
                                .cornerRadius(4)
                                .padding(.vertical, 4)
                            VStack{
                                Text(category.key)
                                    .fontWeight(.semibold)
                            }
                        })
                    }
                }
                
            }

推荐答案

你可以在列表中输入ForEach,而不是在类别上循环列表.

然后,你可以有一个Collection 夹链接,并把它放在不同的部分,以区分它.

List {
    Section {
        NavigationLink {
            Favorites(con: /* (1) */ ConsoleList.consoles)
        } label: { /* ... */ }
    }

    Section {
        ForEach(categories, id: \.key) { category in
            // ...
        }
    }
}

(1) 您还需要传入所有要显示的控制台的列表.

Swift相关问答推荐

{Singleton类}类型的值没有成员$showegView'

SwiftUI-如何使用剩余时间制作倒计时计时器

可以';t在标记为@Observable的类上使用属性包装

如何使用Duration.TimeFormatStyle以h m s格式快速格式化时间

协议元类型'SomeProtocol.Type'上无法使用静态成员'currency'

SwiftUI .task 视图修改器:运行在哪个线程中?

在 init(from decoder: Decoder) 方法中访问原始 JSON 数据

解码 JSON 时 Swift Struct Decoder 初始化程序错误

有没有一种方法可以访问封闭实例ObservableObject以从属性包装器中的任何位置调用objectWillChange.send()

Swift Random Float Fatal Error:在无限范围内没有均匀分布

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

在主要参与者中启动分离任务和调用非隔离函数之间的区别

在 SwiftUI 中的 ForEach 中使用 id 时如何为数组设置动画索引

为什么 Apple Scrumdinger Sample App 使用两个事实来源?

SwiftUI:从存储在 observableObject 中的数组中删除对象时查看崩溃

iOS:检测设备是否为 iPhone X 系列(无框)

如何在 Swift 中将 UILabel 居中?

使用 phimagemanager 将图像保存到自定义相册?

使用 swift IOS 使 UIBarButtonItem 消失

如何快速从另一个视图控制器重新加载表格视图