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

问题描述

我有一个 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,如果没有标题,您必须提供一个默认值。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...