#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
после асинхронного обработчика завершения, скорее всего, не будет работать в большинстве условий.