Как добавить данные в первую строку таблицы до того, как она будет заполнена элементами MPmedia из запроса?

Я потихоньку собираю музыкальный проигрыватель. Я запрашиваю данные альбома для заполнения таблицы. Если пользователь выбирает альбом, мы переходим к новому экрану, чтобы выбрать песню для воспроизведения. Я хотел бы сделать первую строку таблицы альбомов (в контроллере просмотра альбомов) строкой под названием «Все песни», но я не смог понять, как это сделать.

Я пытался использовать: insertRowsAtIndexPaths. Но безуспешно.

    @IBOutlet var albumsTableView: UITableView!

    let qryAlbums = MPMediaQuery.albums()  // Query the albums

    // Set the cell in the table
    func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell {

        // I am using the custom class that I created called: myCustomAlbumTableViewCell
        let cell = tableView.dequeueReusableCell(withIdentifier: "albumIdCell", for: indexPath) as! myCustomAlbumTableViewCell

        let rowItem = qryAlbums.collections![indexPath.row]

        cell.albumTitle.text = rowItem.items[0].albumTitle

        return cell
    }

person James64    schedule 03.02.2019    source источник


Ответы (1)


Просто убедитесь, что вы отображаете на одну строку больше, чем у вас есть альбомы запросов, а затем каждый раз, когда вам нужно получить альбом запросов, вы минус 1 из indexPath.row

    @IBOutlet var albumsTableView: UITableView!

    let qryAlbums = MPMediaQuery.albums()  // Query the albums

    // Set the cell in the table
    func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell {

        // I am using the custom class that I created called: myCustomAlbumTableViewCell
        let cell = tableView.dequeueReusableCell(withIdentifier: "albumIdCell", for: indexPath) as! myCustomAlbumTableViewCell

        if indexPath.row == 0 {
            cell.albumTitle.text = "All Songs"
        } else {

            let rowItem = qryAlbums.collections![indexPath.row-1]

            cell.albumTitle.text = rowItem.items[0].albumTitle
        }

        return cell
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) ->  Int {
        return qryAlbums.collections! .count + 1
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if indexPath.row > 0 {
            let rowItem = qryAlbums.collections![indexPath.row-1]
        }
    }
person Kevin    schedule 04.02.2019
comment
Спасибо вам за помощь! Он частично рабочий. Пользователь должен иметь возможность выбрать эту первую строку (Все песни). Затем, когда я перехожу к следующему контроллеру представления, я знаю, что нужно перечислить все песни со всех альбомов этого исполнителя. Например, если у исполнителя есть 4 альбома в музыкальной библиотеке на устройстве, я перечисляю все песни, а затем названия 4 альбомов. При тестировании первые 4 строки работают, а вот пятая вылетает. - person James64; 04.02.2019
comment
Я использую didSelectRowAtIndexPath... func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {self.performSegue(withIdentifier: rowSelectedGotoSongsVC, отправитель: tableView)} - person James64; 04.02.2019
comment
Я не уверен, что понимаю проблему. У вас есть 5 строк в вашем tableView. Первый — «Все песни». Остальные 4 — названия альбомов. Насколько я понимаю, это работает и отображается правильно. Но если вы нажмете на последнюю строку, приложение вылетит? похоже, что вы не вычитаете 1 из indexPath.row при получении фактического элемента строки: let rowItem = qryAlbums.collections![indexPath.row-1] - person Kevin; 04.02.2019
comment
Ты прав! Я вычел 1 из указанного вами места (внутри cellForRowAtIndexPath), но забыл сделать это в коде, который обрабатывает переход (вчера я забыл опубликовать этот раздел). В любом случае, хотя мне нужно провести дополнительное тестирование, ваше решение работает. Большое спасибо, что выручили меня!!! - person James64; 05.02.2019