【问题标题】:How to solve error: 'Missing arguments for parameters 'data', 'detailedData' in call'如何解决错误:'缺少参数'data','detailedData'调用中的参数'
【发布时间】:2021-07-09 15:18:02
【问题描述】:

我正在尝试从联系人列表中查看联系人的详细信息。这是该视图的 WIP。我收到错误消息;

在调用中缺少参数“data”、“detailedData”的参数

ContactDetail_Previews 结构中与ContactDetail() 一致。

我想我理解这是因为变量 data 和 detailData 中缺少某些内容,但我的困惑来自于我如何将类似的代码用于所有联系人的实际列表视图,而没有此类错误。我已将整个列表视图的代码粘贴在详细视图的代码下方。

任何帮助将不胜感激!

联系方式代码:

import SwiftUI

struct ContactDetail: View {
    var data: Response_Detailed.Contact_Detailed
    @ObservedObject var detailedData: getData_Detailed

    var body: some View {
        VStack {
            Text(data.first_name + " " + data.last_name)
            Text(data.phone_number)
            Text(data.birthday)
            Text(data.address)
            Text(data.updated_date)
            Text(data.create_date)
                .onAppear {
                DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                    self.detailedData.updateDetailed_Data()
                }
            }
        }
    }
}

class getData_Detailed: ObservableObject {
    @Published var data = [Response_Detailed.Contact_Detailed]()
    @Published var id = 1
    
    init() {
        updateDetailed_Data()
    }
    
    func updateDetailed_Data() {
        let url = "DATABASE_LINK\(id)"
        let session = URLSession(configuration: .default)
        
        session.dataTask(with: URL(string: url)!) { (data, _, err) in
            if err != nil {
                print((err?.localizedDescription)!)
                return
            }
            
            do {
                let json = try JSONDecoder().decode(Response_Detailed.self, from: data!)
                let oldData = self.data
                
                DispatchQueue.main.async {
                    self.data = oldData + json.data
                    
                    let encoder = JSONEncoder()
                    encoder.outputFormatting = .prettyPrinted
                    let data = try! encoder.encode(json)
                                            
                    print(String(data: data, encoding: .utf8)!)
                }
            }
            catch {
                print(error.localizedDescription)
            }
        }.resume()
    }
}

struct ContactDetail_Previews: PreviewProvider {
    static var previews: some View {
        ContactDetail()
    }
}

struct Response_Detailed: Codable {
    struct Contact_Detailed: Codable, Identifiable {
        public let id: Int
        public let first_name: String
        public let last_name: String
        public let birthday: String
        public let phone_number: String
        public let create_date: String
        public let updated_date: String
        public let address: String
    }
    public let data: [Contact_Detailed]
    enum CodingKeys : String, CodingKey {
        case data = "data"
    }
}

联系人列表查看代码:(注意与NavigationLink 相同的错误。

import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            HStack {
                ContactsList()
                    .navigationBarTitle("Contacts")
                    .toolbar {
                        ToolbarItem(placement: .navigationBarTrailing) {
                            Image(systemName: "plus")
                                .resizable()
                                .aspectRatio(contentMode: .fit)
                                .frame(width: 20.0)
                    }
                }
            }
        }
    }
}

struct ContactsList: View {
    @ObservedObject var listData = getData()
    
    var body: some View {
        List(0..<listData.data.count, id: \.self) {i in
            NavigationLink(destination: ContactDetail()) {

                if i == self.listData.data.count - 1 {
                    cellView(data: self.listData.data[i], isLast: true, listData: self.listData)
                }
                else {
                    cellView(data: self.listData.data[i], isLast: false, listData: self.listData)
                }
            }
        }
    }
}

struct cellView: View {
    var data: Response.Contact
    var isLast: Bool
    @ObservedObject var listData: getData
    
    var body: some View {
        VStack(alignment: .leading, spacing: 12) {
            if self.isLast {
                Text(data.first_name + " " + data.last_name)
                    .fontWeight(/*@START_MENU_TOKEN@*/.bold/*@END_MENU_TOKEN@*/)
                    .font(.title2)
                    .padding(/*@START_MENU_TOKEN@*/[.leading, .bottom, .trailing], 5.0/*@END_MENU_TOKEN@*/)
                    .onAppear {
                        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                            self.listData.updateData()
                    }
                }
            }
            else {
                Text(data.first_name + " " + data.last_name)
                    .fontWeight(/*@START_MENU_TOKEN@*/.bold/*@END_MENU_TOKEN@*/)
                    .font(.title2)
                    .padding(/*@START_MENU_TOKEN@*/[.leading, .bottom, .trailing], 5.0/*@END_MENU_TOKEN@*/)
            }
        }
        .padding(.top, 10)
    }
}

class getData: ObservableObject {
    @Published var data = [Response.Contact]()
    @Published var limit = 15
    @Published var skip = 0
    
    init() {
        updateData()
    }
    
    func updateData() {
        let url = "DATABASE_LINK?skip=\(skip)&limit=\(limit)"
        let session = URLSession(configuration: .default)
        
        session.dataTask(with: URL(string: url)!) { (data, _, err) in
            if err != nil {
                print((err?.localizedDescription)!)
                return
            }
            
            do {
                let json = try JSONDecoder().decode(Response.self, from: data!)
                let oldData = self.data
                
                DispatchQueue.main.async {
                    self.data = oldData + json.data
                    self.limit += 15
                    self.skip += 15
                    
                    let encoder = JSONEncoder()
                    encoder.outputFormatting = .prettyPrinted
                    let data = try! encoder.encode(json)
                                            
                    print(String(data: data, encoding: .utf8)!)
                }
            }
            catch {
                print(error.localizedDescription)
            }
        }.resume()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

struct Response: Codable {
    struct Contact: Codable, Identifiable {
        public let id: Int
        public let first_name: String
        public let last_name: String
        public let updated_date: String
    }
    struct Pagination_Data: Codable {
        public let skip: Int
        public let limit: Int
        public let total: Int
    }
    public let data: [Contact]
    public let pagination: Pagination_Data
    enum CodingKeys : String, CodingKey {
        case data = "data"
        case pagination = "pagination"
    }
}

【问题讨论】:

    标签: json swift


    【解决方案1】:

    您的ContactsList 正在给唯一的变量一个初始值。

    @ObservedObject var listData = getData()
    

    不是 IAW Apple 文档,而是 = getData() 是初始值

    https://developer.apple.com/documentation/swiftui/managing-model-data-in-your-app

    顺便说一句,您应该将其更改为

    @StateObject var listData = getData()
    

    你的ContactDetailView有两个没有初始值的变量

    struct ContactDetail: View {
        var data: Response_Detailed.Contact_Detailed
        @ObservedObject var detailedData: getData_Detailed
    

    没有= 符号,所以struct 创建一个看起来像这样的init

    init(data: Response_Detailed.Contact_Detailed, detailedData: getData_Detailed)
    

    所以在你的预览中你需要提供初始值

    ContactDetail(data: /.../, detailedData: /.../)
    

    /.../ 表示您将提供样本数据的位置

    【讨论】:

    • 我看到这里发生了什么,我只需要提供一些初始值或使用 =。请问我究竟如何提供初始值,以及我在那里提供什么。对此进行一些澄清会有所帮助。另外,为什么ContactsList中的data变量没有出现这个问题,而ContactDetail却出现了这个问题?
    • 这是因为详细视图中的变量没有初始值。我的答案的第一部分详细说明了原因。我不能给你预览的初始值,因为你没有提供足够的信息来给你。这就是为什么我把它留空。你有什么代码可以生成测试数据?您可能不想在预览期间进行 API 调用,因为每次您进行微小更改时都会调用。
    猜你喜欢
    • 2019-11-25
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 2015-01-15
    • 2016-09-15
    • 2012-02-01
    • 1970-01-01
    相关资源
    最近更新 更多