【问题标题】:list is not loading in swiftUI after. update列表未在 swiftUI 中加载。更新
【发布时间】:2020-03-12 09:17:40
【问题描述】:

我使用 AlamoFire 从服务器获取了一些数据,请求很好,模型都很好,问题是,请求完成后,我的 @State 变量没有更新。

import SwiftUI
import Combine

struct ViewLaundryHome: View {

    @State var items = LaundryItemCategoryViewModel()

    var body: some View {
        VStack {
            Text(items.items.count.description) // returns 0 and never updates
        }
    }
}

class LaundryItemCategoryViewModel: ObservableObject {

    var didChange = PassthroughSubject<LaundryItemCategoryViewModel, Never>()

    var items = [LaundryItemCategory.Result.Doc]() { didSet { didChange.send(self) } }

    init() {
        productCategoryR {
            let d = try! JSONDecoder().decode(LaundryItemCategory.self, from: $0)
            self.items = (d.result?.docs!)!
            print(self.items.count) // returns 5
        }
    }
}

我想我完全按照 youtube 上的这个视频做的,但它不适合我。

https://www.youtube.com/watch?v=xT4wGOc2jd4&t=17s

这是我的数据模型:

struct LaundryItemCategory: Codable {
    let result: Result?
    let id: Int?

    enum CodingKeys: String, CodingKey {
        case result = "Result"
        case id = "Id"
    }

    struct Result: Codable {
        let docs: [Doc]?
        let currentPage: Int?
        let pages: Int?
        let limit: Int?
        let total: Int?

        enum CodingKeys: String, CodingKey {
            case docs = "Docs"
            case currentPage = "CurrentPage"
            case pages = "Pages"
            case limit = "Limit"
            case total = "Total"
        }

        struct Doc: Codable, Hashable, Identifiable {
            let id: Int
            let title: String
            let media: String
            let price: Int

            enum CodingKeys: String, CodingKey {
                case id = "Id"
                case title = "Title"
                case media = "Media"
                case price = "Price"
            }
        }
    }
}

之后。一些挖掘:

发生了一些奇怪的事情。我向应用程序添加了另一个状态,并使用文本字段对其进行了更改,就在我更改新状态的值的那一刻,第一个状态更新:-/

@State var items = LaundryItemCategoryViewModel()

@State var i = ""

var body: some View {
    VStack {
        Text(items.items.count.description)
        TextField("sss", text: $i)
        Text(i)
    }
}

【问题讨论】:

    标签: ios swiftui


    【解决方案1】:

    就像我说的,您需要将 ViewLaundryHome 中的项目设置为 ObservedObject 以便接收更新。在 LaundryItemCategoryViewModel 中,您需要发布项目。这是在 iPhone 11 Pro Max 13.3 和 Xcode 版本 11.3.1 中测试的工作代码。让我知道这是否有效。

    import SwiftUI
    import Combine
    
    struct ViewLaundryHome: View {
        @ObservedObject var items = LaundryItemCategoryViewModel()
    
        var body: some View {
            VStack {
                Text(items.items.count.description)
            }
        }
    }
    
    class LaundryItemCategoryViewModel: ObservableObject {
    
        // var didChange = PassthroughSubject<LaundryItemCategoryViewModel, Never>() // Not needed
    
        @Published var items = [LaundryItemCategory.Result.Doc]() // Add Published
        // { didSet { didChange.send(self) } } - Not needed
    
        init() {
            // Delaying the creation of data to mimic data coming from a webserver
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5.0) {
                let x = LaundryItemCategory.Result.Doc(id: 1, title: "Test", media: "Test", price: 0)
                let y = LaundryItemCategory.Result.Doc(id: 2, title: "Test", media: "Test", price: 0)
    
                self.items.append(x)
                self.items.append(y)
            }
    
            print(self.items.count) // returns 5
        }
    }
    

    【讨论】:

    • 你能分享一些有限的工作代码,以便我调试吗?
    • PassthroughSubject() -- 这行不需要吗?
    • 不需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    相关资源
    最近更新 更多