簡體   English   中英

Swift 2-將數據從數組加載到UITableView中的單元格

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM