MPMediaItem 数组不在 SwiftUI 列表中打印歌曲标题

MPMediaItem array not printing song titles in SwiftUI List

我有一个 Swift 项目可以在 table 视图中打印歌曲列表。以下是检索这些歌曲并将其放入行中的当前工作代码的基础。

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 UI:

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 正在迭代的当前元素,因此实际上没有理由使用索引。由于 titleString?Text 需要 non-optional String,如果没有标题,您必须提供默认值。