问题描述
我有一个 Swift 项目,可以在表格视图中打印歌曲列表。以下是用于检索和将这些歌曲按行排列的当前工作代码的基础。
斯威夫特:
var mySongs: [MPMediaItem] = []
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let song = mySongs[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "cell",for: indexPath)
let myText = song.title
cell.textLabel?.text = myText; return cell
}
我正在尝试将此代码移至 SwiftUI。
Swift 用户界面:
private var mySongs: [MPMediaItem] = []
var body: some View {
List {
let song = mySongs[indexPath.row]
let myText = song.title
ForEach(self.mySongs,id: \.self) {
item in Text(myText)
}
}
}
但是,SwiftUI 不允许我跟踪每个元素的路径。即使我尝试用 myText 替换 mySongs.title 以消除对 indexPath 的需要,它也失败了。
ForEach(self.mySongs,id: \.self) {
item in Text(mySongs.title)
}
给我一个 “[MPMediaItem]”类型的值没有成员“title” 错误。
我想也许我在这个上做 for-each 是完全错误的,所以我去看看其他方法,比如这个网站上的 https://learnappmaking.com/swiftui-list-foreach-how-to/ 什么,但是在实施时我得到了相同的结果并且同样不成功。
我遗漏了什么或我应该在哪里解决问题?
解决方法
看起来您走在正确的轨道上——我认为只是对 ForEach
在闭包中提供的内容有点困惑。
这应该有效:
private var mySongs: [MPMediaItem] = []
var body: some View {
List {
ForEach(mySongs,id: \.self) { item in
Text(item.title ?? "unknown title")
}
}
}
item
为您提供 ForEach
正在迭代的当前元素,因此实际上没有理由使用索引。由于 title
是一个 String?
,而 Text
需要一个非可选的 String
,如果没有标题,您必须提供一个默认值。