【发布时间】:2021-06-03 14:25:29
【问题描述】:
第一个 iOS 应用。如果 VM 中的 items 被替换为一个元素较少的数组,我会得到以下异常,放置异常断点不会提供任何有用的信息:
*** 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“索引 (1176) 超出范围 (1176)”
查看:
struct LibrarySongsPageView: View {
@StateObject var viewModel = LibrarySongsViewModel()
var body: some View {
print(viewModel.items.count)
return List(viewModel.items, id: \.persistentID) { mediaItem in
HStack {
if let art = mediaItem.artwork, let uiImg = art.image(at: CGSize(width: 60, height: 60)) {
Image(uiImage: uiImg)
.toIcon()
.padding(.trailing)
} else {
Image(systemName: "music.note")
}
Text(mediaItem.title ?? "Unknown")
.font(.title2)
}
}.navigationTitle("Songs")
}
}
虚拟机:
class BaseLibraryViewModel: ObservableObject {
let provider = LibraryProvider.instance
@Published var items = [MPMediaItem]()
let sortOrder = SortOrder.title
var subscription: AnyCancellable!
init() {
subscription = provider.setActive(active: true, type: .songs)!.sink { [weak self] items in
self?.items = items
}
}
}
class LibrarySongsViewModel: BaseLibraryViewModel {}
我已经通过将正文的第一行更改为:
return List(viewModel.items.indices, id: \.self) { index in
let mediaItem = viewModel.items[index]
}
但我不知道为什么第一个版本会产生异常。当访问视图body 属性时,我检查了viewModel.items.count 和po viewModel.items,它看起来数组是更新后的数组,比我预期的前一个项目少一个,但在@987654328 期间仍然抛出异常@访问。
谁能解释一下?
【问题讨论】:
标签: ios swiftui combine swiftui-list