![](/img/trans.png)
[英]Initializer `init(:_rowContent:)` requires that `Type` confirm to `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
只是添加Encodable
和Decodable
的简写。 因此,如果您不需要两者,则只需使用您需要的一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.