试图找出我的错误“调用中缺少参数'plans'的参数;插入'计划:<#计划#>'”

Trying to figure out my error for "Missing argument for parameter 'plans' in call; Insert 'plans: <#Plans#>'"

提问人:JR10 提问时间:2/24/2023 更新时间:2/25/2023 访问量:50

问:

SwiftUI 的新手,到处搜索以找出我认为是一个简单的问题。因此,我向社区寻求帮助或教育。非常感谢任何帮助,并将帮助我摆脱困境。

我知道抛出错误是因为我的行期望传递给它的某种类型的值,但我无法弄清楚它想要的值是什么。

我正在尝试从 Core Data 中提取数据,并使用数组中的数据将其格式化为行,以便用户可以查看他们的行程。

import SwiftUI
import CoreData

struct IteneraryView: View {
    
    @Environment(\.managedObjectContext) private var viewContext
    
    @FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Plans.date, ascending: false)], animation: .default)
    
    private var listPlans: FetchedResults<Plans>
    
    //Date formatter
    var dateFormatter: DateFormatter {
        let formatter = DateFormatter()
        formatter.dateStyle = .short
        return formatter
    }
    
    //Ability to group entries
    func groupedEntries(_ result: FetchedResults<Plans>) -> [[Plans]] {
        return Dictionary(grouping: result) { (element: Plans) in
            dateFormatter.string(from: element.date!)
        }.values.sorted() { $0[0].date! > $1[0].date! }
    }
    
    var body: some View {
        NavigationStack {
            //TRY THE UPDATED FETCH CODE HERE
            List {
                ScrollView {
                    ForEach(listPlans) { plan in
                        RowView() //<<THIS IS WHERE I GET THE ERROR; IT WANTS plans: <#Plans#>?

                    }      
                }
            } //List
            .navigationBarTitle(Text("My Itenerary"))
        } //NavigationView
        .dynamicTypeSize(.xSmall ... .xxxLarge)
        
    }
    

这是 RowView

import SwiftUI
import CoreData

struct RowView: View {

    let plans: Plans
    
    var body: some View {
        HStack(alignment: .top) {

            VStack(alignment: .leading, spacing: 2) {
                Text(plans.showTitle)
                    .bold()
                Text("\(plans.showDate, style: .date)")
                    .font(.caption2)
                //Spacer()
            }.padding(.top, 5)
            Spacer()
        }.padding(.top, 5)
    }
}

//struct RowView_Previews: PreviewProvider {
//    static var previews: some View {
//        RowView(plans: Plans)
//    }
//}

和扩展

我有一个名为“计划”的核心数据实体,带有“标题”和“日期”

import Foundation
import SwiftUI

extension Plans {
    
    var showTitle: String {
        return title ?? "Undefined"
    }
    var showDate: Date {
        return date ?? Date()
    }
}

我试图允许用户从列表中选择一个事件,他们将该事件与地区和城市一起显示在他们的行程中。

import SwiftUI
import Foundation


class UserSelections: ObservableObject {
    @Published var selectedRide = ""
}

struct Event: Identifiable {
    let id = UUID()
    var index: Int
    var name: String
    var district: String
    var city: String
}

var events = [
    Event(index: 1, name: "Concert", district: "Power and Light", city: "Kansas City"),
    Event(index: 2, name: "Museum", district: "Art", city: "Kansas City"),
    Event(index: 3, name: "Grand Central", district: "Downtown", city: "Kansas City"),
]

但是我无法弄清楚那个讨厌的 RowView 希望我传递给它什么。在我的学习之旅中,非常感谢任何帮助。

我以为我可以通过,但事实并非如此。我尝试传递 Plans(),这似乎有效,但随后使预览崩溃。我也试过了RowView(plans: plans)

RowView(plans: <title: "Event", date: Date()>)

但我不想传递该永久信息(而且无论如何它都不起作用)。

我觉得我已经尝试了计划、标题和日期的所有组合,而 XCode 不喜欢其中任何一个。再次感谢。

swiftui core-data 参数传递

评论

0赞 lorem ipsum 2/24/2023
这回答了你的问题吗?SwiftUI 预览版中的模拟核心数据对象

答:

0赞 Tom Harrington 2/25/2023 #1

这是一个 Swift 问题,与 Core Data 或 SwiftUI 无关。您的内容包括:RowView

let plans: Plans

如果 Swift 结构包含声明,则在创建结构实例时必须为其提供值。在这种情况下,您不能调用,因为这不包括 的值。您必须将其称为 .letRowView()plansRowView(plans: [put some instance of Plans here])

这是任何具有属性的 Swift 结构的规则。您可以在 Apple 的 Swift 语言指南中阅读有关 Swift 初始化规则的更多信息。let

在这种特定情况下,由于您正在用 填充滚动视图,我认为您需要更改以读取 。这样,您就可以将 from the 传递到初始化中。ForEach(listPlans) { plan in .... }RowView()RowView(plans: plan)planForEachRowView

评论

0赞 JR10 2/25/2023
工作!汤姆,你很棒。感谢您抽出宝贵时间解释、分享链接和建议。真的很感激。