Почему в моем табличном представлении отображается только около 20 моих элементов из массива?

#ios #swift #media-player #mpmedialibrary

#iOS #swift #медиаплеер #mpmedialibrary

Вопрос:

Мое приложение некорректно отображает все элементы в моем массиве. Что является причиной этого?

     var songamount = ["Refresh Page"]
    var songImageAmount = [MPMediaItemArtwork]()

    override func viewDidLoad() {
        super.viewDidLoad()
        MPMediaLibrary.requestAuthorization { (status) in
            let myPlaylistQuery = MPMediaQuery.playlists()
            let playlists = myPlaylistQuery.collections
            self.songamount.remove(at: 0)
            for playlist in playlists! {
                print(playlist.value(forProperty: MPMediaPlaylistPropertyName)!)

                let songs = playlist.items
                for song in songs {
                    let songTitle = song.value(forProperty: MPMediaItemPropertyTitle)
                    let songImage = song.artwork
                    self.songamount.append(songTitle as! String)
                    self.songImageAmount.append(songImage!)
                    print("tt", songTitle!)

            }
            print(self.songamount)
            print("Song Amount:(self.songamount.count)")
            print("Image Amount: (self.songImageAmount.count)")


            }
        }
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return songamount.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "LibraryCell", for: indexPath) as! LibraryCell
        cell.LibraryTitle.text = songamount[indexPath.row]
        //cell.LibraryImage.image = songImageAmount[indexPath.row]
        print(indexPath)

        return cell

    }
}
  

Это мой код для отображения всех песен в пользовательской библиотеке Itunes, но он отображает только 20 элементов из массива в TableView.

Обновление — я получил его, чтобы правильно составить список всех моих песен, но в списке отображается только 33 из них. Вот обновленный код

     @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var TextDebug: UILabel!

    var songamount = ["Please Reload View"]
    var songImageAmount = [MPMediaItemArtwork]()

    override func viewDidLoad() {
        super.viewDidLoad()
        MPMediaLibrary.requestAuthorization { (status) in
            let mySongQuery = MPMediaQuery.songs()
            let songs = mySongQuery.collections
            self.songamount.remove(at: 0)
            for song in songs! {
                print(MPMediaItemPropertyTitle)

                let songs = song.items
                for song in songs {
                    let songTitle = song.value(forProperty: MPMediaItemPropertyTitle)
                    //let songImage = song.artwork
                    self.songamount.append(songTitle as! String)
                    //self.songImageAmount.append(songImage!)
                    print("tt", songTitle!)

            }
            print(self.songamount)
            print("Song Amount:(self.songamount.count)")
            //print("Image Amount: (self.songImageAmount.count)")


            }
        }
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return songamount.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "LibraryCell", for: indexPath) as! LibraryCell
        cell.LibraryTitle.text = songamount[indexPath.row]
        //cell.LibraryImage.image = songImageAmount[indexPath.row]
        let sections: Int = tableView.numberOfSections
        var rows: Int = 0

        for i in 0..<sections {
            rows  = tableView.numberOfRows(inSection: i)
            TextDebug.text = "(rows)"
        }


        return cell

    }
  

Комментарии:

1. Что songamount.count возвращается?

2. @Koen Он возвращает 472, что по какой-то причине превышает количество песен, которые у меня есть в моей библиотеке. Я сейчас изучаю это

3. Убедитесь, что вы перезагрузили табличное представление (в основной очереди) после завершения обновления модели данных.

4. И вам нужно проверить значение status в блоке requestAuthorization завершения. Вы должны пытаться получить доступ к песням только в том случае, если статус .authorized .

5. @rmaddy Я уже запустил .авторизованный код в более раннем разделе приложения, который нельзя передать, если доступ не авторизован

Ответ №1:

Решением моей проблемы было добавление tableView.reloadData() в конец viewDidLoad()

Комментарии:

1. Нет, решение состоит в том, чтобы вызвать reloadData() сразу после окончания for цикла, внутри блока завершения.

2. @rmaddy То, что я сделал, сработало, поэтому для меня это было решение, которое тоже могло бы сработать, но не то, что я сделал.

3. Вызов reloadData после асинхронного обработчика завершения, скорее всего, не будет работать в большинстве условий.