Назначить текст метки ячейки UITableView из словаря Swift - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь получить значение из быстрого словаря для отображения в виде текстовых ячеек.Я получаю сообщение об ошибке:

Тип «Любой» не имеет подписных элементов

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

Я полагаю, что я мог установить переменные неправильно, значение передается с использованиемпереход от другого табличного представления с использованием didSelectRowAt. * ​​1008 *

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

Это мой текущий код viewcontroller:

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)

Результат, который я получаюis:

[demoApp.Audiofile (id: 1, filetitle: «Пример файла один», имя файла: «reath5mins », формат файла:« mp3 »), demoApp.Audiofile (id: 2, filetitle): «Пример файла два», имя файла: «дыхание10 минут», формат файла: «mp3»), demoApp.Audiofile (id: 3, заголовок файла: «Пример файла три», имя файла: «дыхание 20 минут», формат файла: «mp3»)]

Как я могу использовать заголовок файла как текст метки для моей ячейки?

Цель состоит в том, чтобы отобразить заголовок и открыть другое представление при щелчке ячейки и позволить пользователю нажать кнопкуна новом экране и воспроизведите файл mp3.

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Очевидно, что объект не a словарь Swift , это пользовательский класс или структура.

Вы боретесь с системой сильных типов Swift. Не делайте этого .

Объявите audios с статическим типом

var audios = Array<AudioFile>()

и используйте точечную запись вместо небезопасного KVC (который не работает в любом случае в этом случае).

cell.audioLabel.text = audiofiles.filetitle
0 голосов
/ 10 сентября 2018

Вы объявили свой массив как Array<Any> - это означает, что массив может содержать что угодно ; элементы массива не обязательно должны быть одного типа. В результате компилятор Swift не знает, что он получает от audios[indexPath.row]; это может быть словарь, это может быть массив или целое число. Когда вы пытаетесь использовать подписку, компилятор выдает ошибку, потому что не знает, поддерживает ли элемент подписку , то есть Int нет, а Any может быть Int .

Не используйте Any или AnyObject в Swift, если вы знаете фактический тип; Безопасность типов 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
}
0 голосов
/ 10 сентября 2018

Причиной возникновения ошибки является Any - объект без определения. Вы можете разыграть его в AudioFile следующим образом:

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

Если audios является массивом AudioFile только тогда, объявите его как таковой, и вы можете использовать его так, как вы описали.

...