为啥我的 SwiftUI 列表没有填充我的所有数据?

Posted

技术标签:

【中文标题】为啥我的 SwiftUI 列表没有填充我的所有数据?【英文标题】:Why is my SwiftUI List not being populating with all my data?为什么我的 SwiftUI 列表没有填充我的所有数据? 【发布时间】:2019-12-10 08:42:49 【问题描述】:

我的数据是通过以这种方式使用组合的 api 调用返回的:

[Animals.Dog(id: nil, name: "Bobby", age: 4), Animals.Dog(id: nil, name: "Cronos", age: 2), Animals.Dog(id: nil, name: "Willy", age: 2), Animals.Dog(id: nil, name: "Rex", age: 8)]
finished

当用动物数组填充我的列表时,只填充第一项。但同样的第一个项目显示的动物数量与它们一样多。在这种情况下,第一项被填充了 4 次,而我在列表中看不到其他三只狗。

我的数据隐藏在哪里?

import SwiftUI
import Combine

struct AnimalsView: View 

  @State private var dogs = [Dog]()

  private let networkRequest = NetworkRequest()

  //MARK: - Body
  var body: some View 
    VStack(spacing: 20) 
      TitleView()

      //MARK: Dogs list view
      List(dogs) 
        AnimalCell(name: $0.name,
                   age: $0.age)
      
      .modifierViewList()
    
    .onAppear 
      _ = networkRequest.downloadAnimals()
        .sink(receiveCompletion: 
          print($0)
        ,receiveValue:  (animal) in
          self.dogs = animal.dogs
          print(animal.dogs)
        )
    
  


//MARK: Network request
extension NetworkRequest 
  func downloadAnimals() -> AnyPublisher<Animal, Error> 
    URLSession.shared
      .dataTaskPublisher(for: EndPoint.rates.url)
      .receive(on: networkQueue)
      .map(\.data)
      .decode(type: Animal.self, decoder: JSONDecoder())
      .mapError  (error) -> NetworkRequest.Error in
        switch error 
        case is URLError:
          return Error.addressUnreachable(EndPoint.rates.url)
        default:
          return Error.invalidResponse
        
    
    .eraseToAnyPublisher()
  

【问题讨论】:

【参考方案1】:

如果Animal.Dog符合Identifiable,那么你所有的数据都有相同的id,即nil。因此,List 认为你只有一个不同的Animal.Dog,第一个是idnil。尝试给他们实际的ids。

【讨论】:

【参考方案2】:

[Animals.Dog(id: 1, name: "Bobby", age: 4), Animals.Dog(id: 2, name: "Cronos", age: 2), Animals.Dog(id: 3, name: "Willy", age: 2), Animals.Dog(id: 4, name: "Rex", age: 8)]

【讨论】:

最好的方法是用 let id = UUID() 而不是 let id: Int 声明我的 Dog 结构?

以上是关于为啥我的 SwiftUI 列表没有填充我的所有数据?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 SwiftUI 列表填充相同的项目 4 次而不是全部 4 个项目?

为啥我的 SwiftUI 列表分隔符没有正确排列?

为啥我的表没有被填充?

为啥我的 RecyclerView 没有填充来自改造的数据?

SwiftUI MacOS 列表的 Inset 填充

为啥我的绑定 [String] 不会更改我的多选列表 SwiftUI