通用结构 'ObservedObject' 要求 'Video' 符合 SwiftUI 中的 'ObservableObject'

Posted

技术标签:

【中文标题】通用结构 \'ObservedObject\' 要求 \'Video\' 符合 SwiftUI 中的 \'ObservableObject\'【英文标题】:Generic struct 'ObservedObject' requires that 'Video' conform to 'ObservableObject' in SwiftUI通用结构 'ObservedObject' 要求 'Video' 符合 SwiftUI 中的 'ObservableObject' 【发布时间】:2022-01-12 07:46:28 【问题描述】:

我正在尝试调用 API 并将数据填充到 SwiftUI 中的列表中,我是 SwiftUI 的初学者,我正在努力解决提到的错误。 我认为我的数据模型有问题 我已经尝试过在 swift Lnaguage 中进行普通 API 调用的方式,但它看起来并不奏效

这是我得到的错误的图像.. https://i.stack.imgur.com/OpVwh.png

struct testAPIData : Codable,Identifiable 
    public var id: Int?
    let response_code : Int?
    let status : Int?
    let mesagges : String?
    let data_array : testAPIDetails?

    enum CodingKeys: String, CodingKey 

        case response_code = "response_code"
        case status = "status"
        case mesagges = "mesagges"
        case data_array = "data_array"
        case id = "id"
    

    init(from decoder: Decoder) throws 
        let values = try decoder.container(keyedBy: CodingKeys.self)
        response_code = try values.decodeIfPresent(Int.self, forKey: .response_code)
        status = try values.decodeIfPresent(Int.self, forKey: .status)
        mesagges = try values.decodeIfPresent(String.self, forKey: .mesagges)
        id = try values.decodeIfPresent(Int.self, forKey: .id)
        data_array = try values.decodeIfPresent(testAPIDetails.self, forKey: .data_array)
    


struct testAPIDetails : Codable,Identifiable 
    public var id: Int?
    let video : [Video]?
    let moreinfo : [Moreinfo]?
    let photourl : String?
    let topcontent : String?
    let data : Int?

    enum CodingKeys: String, CodingKey 

        case video = "video"
        case moreinfo = "moreinfo"
        case photourl = "photourl"
        case topcontent = "topcontent"
        case data = "data"
        case id = "id"
    

    init(from decoder: Decoder) throws 
        let values = try decoder.container(keyedBy: CodingKeys.self)
        video = try values.decodeIfPresent([Video].self, forKey: .video)
        moreinfo = try values.decodeIfPresent([Moreinfo].self, forKey: .moreinfo)
        photourl = try values.decodeIfPresent(String.self, forKey: .photourl)
        topcontent = try values.decodeIfPresent(String.self, forKey: .topcontent)
        id = try values.decodeIfPresent(Int.self, forKey: .id)
        data = try values.decodeIfPresent(Int.self, forKey: .data)
    



struct Video : Codable,Identifiable 
    public var id: Int?
    public var weburl : String?
    public var heading : String?
    public var description : String?
    public var thumbnail : String?
    public var clickableurl : String?

    enum CodingKeys: String, CodingKey 

        case weburl = "weburl"
        case heading = "heading"
        case description = "description"
        case thumbnail = "thumbnail"
        case clickableurl = "clickableurl"
        case id = "id"
    

    init(from decoder: Decoder) throws 
        let values = try decoder.container(keyedBy: CodingKeys.self)
        weburl = try values.decodeIfPresent(String.self, forKey: .weburl)
        heading = try values.decodeIfPresent(String.self, forKey: .heading)
        description = try values.decodeIfPresent(String.self, forKey: .description)
        id = try values.decodeIfPresent(Int.self, forKey: .id)
        thumbnail = try values.decodeIfPresent(String.self, forKey: .thumbnail)
        clickableurl = try values.decodeIfPresent(String.self, forKey: .clickableurl)
    





这是我的课

class Videos: NSObject,ObservableObject 
    @Published var videoDataArray:[Video] = [Video]()
    override init() 
        if let StartEventURL = URL.init(string:"<<MYAPI>>") 
            let parameters = ["contenttype":"1"]
            var request = URLRequest(url: StartEventURL)
            request.httpMethod = "POST"
            request.setValue("application/json", forHTTPHeaderField: "Content-Type")
            do
                request.httpBody = try JSONSerialization.data(withJSONObject: parameters)
                AF.request(request).responseDataresponse in
                    if let data = response.data
                        do
                          _ = try JSONSerialization.jsonObject(with: data, options: [])
                            let decoder = JSONDecoder()
                            let StartEventResponse = try decoder.decode(testAPIData.self, from: data)
                            DispatchQueue.main.async 
                                self.videoDataArray = (StartEventResponse.data_array?.video)!
                            
                         catch 
                            print(error)
                            DispatchQueue.main.async 
                                //Alert
                            
                        
                    
                .resume()
            catch let error 
                print("Error : \(error.localizedDescription)")
            
        

    





最后是我的内容在这里查看

struct ContentView: View 
    @ObservedObject var videoObject = Video() "I'm getting the error here"
    
    init() 
       
       
    @State private var selection = 0
    @State private var showingAlert = false
    var body: some View 
        NavigationView 
            ZStack(alignment: .topTrailing) 
                VStack 
                    Text("YOUR PRIMARY CARE PROVIDER").font(.title2).fontWeight(.bold).foregroundColor(Color.gray).multilineTextAlignment(.center).padding()
                    Spacer()
                    TabView(selection: $selection) 
                        List(description, id: \.self)  description in
                              Text(description)
                            
                        .tabItem 
                            Image(systemName: "house.fill")
                            Text("Home")
                        .tag(1)
                    .accentColor(.blue)
                    .onAppear() 
                        UITabBar.appearance().barTintColor = .white
                    
                .ignoresSafeArea(.container, edges: .bottom)
            .navigationTitle("My Health")
            
        
    
   



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

【问题讨论】:

最好为类型使用更独特的名称以避免无意的误用(尤其是在代码完成时)。 注意点,谢谢 :-) 【参考方案1】:

根据您的代码,它应该是Videos

struct ContentView: View 
    @ObservedObject var videoObject = Videos()  // << here !!
...

【讨论】:

以上是关于通用结构 'ObservedObject' 要求 'Video' 符合 SwiftUI 中的 'ObservableObject'的主要内容,如果未能解决你的问题,请参考以下文章

将observedObject放入List

SwiftUI - 尽管使用了 @Published 和 @ObservedObject,但视图不会更新

如何确认 AppDelegate 的 ObservableObject?

一个 ObservedObject 需要接受另一个 ObservedObject 作为参数;你怎么做到这一点?

ObservedObject 更改时的通知

如何通过 Binding 和 ObservedObject 更新 UIViewRepresentable 地图