为啥我的 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
,第一个是id
的nil
。尝试给他们实际的id
s。
【讨论】:
【参考方案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 个项目?