[英]Swift 2 - Loading data from an array into cells in UITableView
我有一個數組var previousSongs = [PreviousSong]()
。
此數組中填充了名為getSongs()
的函數中的信息。 我知道該信息已正確地放入previousSongs
數組中
我想在表中使用此數組中的信息。
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.contentInset = UIEdgeInsetsMake(4,0,0,0);
self.tableView.dataSource = self
previousSongs = [PreviousSong(song: "NAME1", artist: "ARTIST1", time: "TIME1"), PreviousSong(song: "NAME2", artist: "ARTIST2", time: "TIME2"), PreviousSong(song: "NAME3", artist: "ARTIST3", time: "TIME3"), PreviousSong(song: "NAME4", artist: "ARTIST4", time: "TIME4"), PreviousSong(song: "NAME5", artist: "ARTIST5", time: "TIME5"), PreviousSong(song: "NAME6", artist: "ARTIST6", time: "TIME6"), PreviousSong(song: "NAME7", artist: "ARTIST7", time: "TIME7"), PreviousSong(song: "NAME8", artist: "ARTIST8", time: "TIME8"), PreviousSong(song: "NAME9", artist: "ARTIST9", time: "TIME9"), PreviousSong(song: "NAME10", artist: "ARTIST10", time: "TIME10"), ]
getSongs()
self.tableView.reloadData()
}
func getSongs() {
let url = NSURL(string: "http://api.vicradio.org/songs/history?amount=10")!
let request = NSMutableURLRequest(URL: url)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) { (data: NSData?, response: NSURLResponse?, error: NSError?) in
if error != nil {
return
}
let name = NSString(data: data!, encoding: NSUTF8StringEncoding) as! String
var songName = ""
var artistName = ""
var quoteNumber = 0
var braceNumber = 0
for character in name.characters {
if braceNumber % 2 == 0 && braceNumber != 0 {
if songName != "" {
quoteNumber = 0
self.previousSongs.append(PreviousSong(song: songName, artist: artistName, time: "TIME"))
songName = ""
artistName = ""
}
}
if character == "{" || character == "}" {
braceNumber++
}
if character == "\"" {
quoteNumber++
}
if quoteNumber == 3 && character != "\"" {
artistName += String(character)
} else if quoteNumber == 7 && character != "\"" {
songName += String(character)
}
}
dispatch_async(dispatch_get_main_queue()) { self.getSongs() }
}
if self.previousSongs.count == 10 {
task!.cancel()
} else {
task!.resume()
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
var song : PreviousSong
song = previousSongs[indexPath.row]
cell.textLabel?.text = song.song + " by " + song.artist
cell.detailTextLabel?.text = "Played at " + song.time
return cell
}
該表將顯示硬編碼的數組( [PreviousSong(song: "NAME1", artist: "ARTIST1",
...),但在getSongs()
函數中對其進行更新后,它不會從該數組中加載信息。 。
如何解決此問題,以便在使用getSongs()
函數中的實際信息更新數組時,單元格將重新加載正確的信息? (我已經嘗試過使用reloadData()方法。)
肯定聽起來您的問題出在getSongs()
函數中。 您介意提供您的實施方案嗎?
關閉我的頭頂,這是可能的,其中至少一個正在發生: previousSongs
被設置為在零或空getSongs()
您的行數據源法的數量沒有返回正確的號碼( previousSongs.count
) 。
編輯:查看代碼后,為什么getSongs()
函數返回數組,然后在數組上使用lazy
關鍵字-然后在previousSongs
數組的實例化中調用getSongs()
函數? 這樣,就無需在viewDidLoad()
上重新加載表。 可以肯定的是,整個過程會更好。
更換:
dispatch_async(dispatch_get_main_queue()) {
self.getSongs()
}
帶有:
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
沒有理由應該在getSongs()
內部調用getSongs()
。 您想在處理完數據后使用reloadData()
重新加載表。 完全處理完數據后, viewDidLoad
中的reloadData()
不會執行。
這是我找到的一種解決方案!
可以使用.insert
方法,而不是將其附加到getSongs()
的數組。 我認為附加是將我想要的信息添加到數組的末尾。 數據已正確加載,但不是我想要的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.