繁体   English   中英

SwiftUI - 错误 - 初始化程序 'init(_:rowContent:)' 要求 'CustomDataModel' 符合 'Identifiable'

[英]SwiftUI - Error - Initializer 'init(_:rowContent:)' requires that 'CustomDataModel' conform to 'Identifiable'

在我的手表应用程序中,我希望显示事件列表。 打开视图后,我向 iPhone 应用程序发送请求以发送事件列表。 到目前为止,这是有效的,我正在将事件列表返回到 Watch。 但是,当我尝试在列表中显示数据时,由于自定义对象类型而出现错误。 我想要的是在数据可用时显示事件列表,或者在没有事件时仅在视图上显示文本。

注意:在设备/操作系统之间传输数据的手表连接不允许自定义数据类型,因此必须符合 Codable 并将数据从 CustomDataModel 转换为 Data 类型,然后再传输,然后在我的 Watch 项目中从 Data 转换为 CustomDataModel。

下面是我看到的代码和错误:

自定义数据模型

import Foundation

struct CustomDataModel: Codable {
    var startEndDate: String?
    
    var startEndTime: String?

    var locationDetails: String?
    
    var actions: Dictionary<String, String> = [:]
    
    var title: String?
    
    // Has more properties
    
    func encodeIt() -> Data {
        let data = try! PropertyListEncoder.init().encode(self)
        return data
    }
    
    static func decodeIt(_ data:Data) -> CustomDataModel {
        let customDataModel = try! PropertyListDecoder.init().decode(CustomDataModel.self, from: data)
        return customDataModel
    }
}

自定义视图模型

import Foundation
import Combine

class CustomViewModel: ObservableObject, SessionCommands {
    @Published var eventsList:[CustomDataModel] = []
    
    init() {
        NotificationCenter.default.addObserver(forName: Notification.Name("eventsListReady"), object: nil, queue: nil, using: self.processEventsList(_:))
    }
    
    @objc func processEventsList(_ notification: Notification) {
        if let response = (notification.object as! CommandStatus).response as? [Data] {
            response.forEach { event in
                eventsList.append(CustomDataModel.decodeIt(event))
            }
        }
     }
    
    func getEventsList() {
        self.eventsList = []
        sendMessage(["functionality": Functionality.events.rawValue, "notificationName": Notification.Name("requestEventsList")])
    }
}

自定义视图

import SwiftUI

struct CustomView: View {
    @ObservedObject var viewModel: CustomViewModel
    
    var body: some View {
        VStack {
            if !viewModel.eventsList.isEmpty {
                List(viewModel.eventsList) { item in
                    let _ = print("##### !viewModel.eventsList.isEmpty")
                    NavigationLink(destination: EventsDetailsView(eventItem: item)) {
                        EventRowView(eventItem: item)
                    }.navigationViewStyle(StackNavigationViewStyle())
                }
            } else {
                let _ = print("##### viewModel.eventsList.isEmpty")
                VStack {
                    Text("No events to display")
                }.frame(maxWidth: .infinity, maxHeight: .infinity)
            }
        }.navigationBarTitle("Back").onAppear() {
            self.viewModel.getEventsList()
        }
    }
}

我在 CustomView 中的“List(viewModel.eventsList)”上遇到错误: Initializer 'init(_:rowContent:)' requires that 'CustomDataModel' conform to 'Identifiable'

我在 CustomViewModel 的 eventList 对象中获取数据,但无法显示它。

给您的类型一个 id 并使其可识别,如果您不需要可确定的,请不要添加它。

struct MyType: Encodable, Identifiable {
  let id = UUID()

  // other properties
}

使用Codable只是添加EncodableDecodable的简写。 因此,如果您不需要两者,则只需使用您需要的一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM