从 Swift 字典中分配 UITableView 单元格标签文本



我正在尝试从快速字典中获取一个值以显示为单元格文本。我收到错误:

类型"任何"没有下标成员

cell.audioLabel.text = audiofiles["filetitle"] <-line producing error

我相信我可能设置了错误的变量,该值是使用 didSelectRowAt 从另一个表视图中使用 segue 传递的。

var audios = Array<Any>() <- gets from another controller

这是我当前的视图控制器代码:

import UIKit
class DetailViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var audioTable: UITableView!
@IBOutlet weak var descText: UITextView!
@IBOutlet weak var clickButton: UIButton!
var practitle = String()
var desc = String()
var hasAudio = Int()
var audios = Array<Any>()
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.title = practitle
descText.text = desc
if hasAudio != 0 {
clickButton.isHidden = false
}
print(audios)
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return audios.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "audiocell", for: indexPath) as! DetailViewCell
let audiofiles = audios[indexPath.row]
cell.audioLabel.text = audiofiles["filetitle"]
return cell
}

当我使用

print(audios)

我得到的结果是:

[demoApp.Audiofile(id: 1, 文件标题: "Sample file one", 文件名: "breath5mins", 文件格式: "mp3"(, demoApp.Audiofile(id: 2, filetitle: "Sample file two", 文件名: "breath10mins", 文件格式: "mp3">

(, demoApp.Audiofile(id: 3, filetitle: "Sample file three", 文件名: "breath20mins", 文件格式: "mp3"(]

如何使用文件名作为单元格的标签文本?

目标是在单元格单击时显示标题并打开另一个视图,并允许用户单击新视图上的按钮并播放 mp3 文件。

显然,该对象不是Swift 字典,它是一个自定义类或结构。

你正在与 Swift 的强大类型系统作斗争。不要那样做

使用静态类型声明audios

var audios = Array<AudioFile>()

并使用点表示法而不是不安全的 KVC(在这种情况下无论如何都不起作用(。

cell.audioLabel.text = audiofiles.filetitle

你已经将数组声明为Array<Any>- 这意味着数组可以包含任何内容;数组的元素甚至不需要都是相同的类型。 结果,Swift 编译器不知道它从audios[indexPath.row]那里得到什么类型的东西;它可以是字典,可以是数组,也可以是整数。 当您尝试使用下标时,编译器会给您一个错误,因为它不知道该项目是否支持下标- 即Int不支持,Any可能是Int

如果您知道实际类型,请不要在 Swift 中使用AnyAnyObject;Swift 的类型安全性允许它在编译时通过了解事物的类型来消除大量潜在的运行时问题。

print语句来看,您的数组似乎包含Audiofile实例(大概是您定义的结构或类,而不是字典(。 因此,您应该正确声明audios

var audios = Array<Audiofile>()

然后,您可以在cellForRow中访问对象的属性:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "audiocell", for: indexPath) as! DetailViewCell
let audiofiles = audios[indexPath.row]
cell.audioLabel.text = audiofiles.filetitle
return cell
}

您收到错误的原因是Any是一个没有定义的对象。您可以将其转换为如下所示的AudioFile

let audiofiles = audios[indexPath.row] as! AudioFile

如果audios只是一个AudioFile数组,则将其声明为数组,您可以按照描述的方式使用它。

相关内容

  • 没有找到相关文章

最新更新