XCode Swift 3 UITableViewController单元格未显示

时间:2017-03-02 18:29:14

标签: ios xcode uitableview swift3

我从itunes api导出json文件>将其转换为json文件>将其发送到firebase>把它带到这里的字典文件中,现在我想把它放到tableview中,但它似乎不起作用,我不知道为什么。我查了一下: 1.我导入的文件已成功转换为字典。 2.数据源和委托连接到此UITableViewController文件。 3.使用其他阵列来检查我的连接是否正确(并且它可以工作,但如果我使用Firebase引入的数据则根本不起作用) 我把单元格样式作为字幕并输入动态。

以下是UITableViewController代码:

import UIKit
import Firebase
class TableViewController1: UITableViewController {

var ref: FIRDatabaseReference!
var rank = [String]()
var song = [[String]]()
var artist = [[String]]()
var tna = [String]()

override func viewDidLoad() {
    super.viewDidLoad()
    self.ref = FIRDatabase.database().reference()

    let userID = FIRAuth.auth()?.currentUser?.uid

    self.ref.child("top100itunes").observeSingleEvent(of: .value, with: { (snapshot) in
        let jsonfile = snapshot.value! as! String
        //print(jsonfile)
        let jsondict:[String:Any] = self.convertToDictionary(text: jsonfile)!
        for (key, value) in jsondict {
            if key != nil {
                self.rank.append(key)
                if value != nil{
                    self.tna.append(value as! String)
                }
            }
        }
        for x in self.tna{
            if x != nil {
                for (key,value) in self.convertToDictionary(text: x)!{
                    self.song.append([key])
                    self.artist.append([value as! String])
                }
            }
        }

    }, withCancel: nil)
}


// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false

// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()


func convertToDictionary(text: String) -> [String: Any]? {
    if let data = text.data(using: .utf8) {
        do {
            return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
        } catch {
            print(error.localizedDescription)
        }
    }
    return nil
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return self.song.count
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return self.song[section].count
}

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return self.rank[section]
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath)
    cell.textLabel?.text = self.song[indexPath.section][indexPath.row]
    cell.detailTextLabel?.text = self.artist[indexPath.section][indexPath.row]
    return cell
}

}

我导入的json文件的结构如下:

{ 1 : { Title : Artist },
  2 : { Title : Artist }, 
  .....
}

2 个答案:

答案 0 :(得分:1)

observeSingleEvent()是异步的,并且在observeSingleEvent()完成填充数据之前将调用numberOfRowsInSection()。 如果在第二个for循环之后调用self.tableView.reloadData(),那么一旦填充了数据,这将导致刷新表视图。

或者,您可以考虑重新设计应用程序,使其具有负责数据检索的单独模型组件,以便在视图启动之前填充数据(如果适用)。

答案 1 :(得分:0)

您的代码正在执行此操作:

  1. viewDidLoad中
  2. 启动firebase async
  3. 询问分段/行的tableview数量
  4. song.count为0
  5. tableview加载没有单元格
  6. firebase async完成并填充歌曲数组
  7. ......没别的
  8. 在这个方法之后你应该像这样添加tableView reloadData:

        for x in self.tna{
            if x != nil {
                for (key,value) in self.convertToDictionary(text: x)!{
                    self.song.append([key])
                    self.artist.append([value as! String])
                }
            }
        }
    
        self.tableView.reloadData()
    

    我同意Halfman的意见,你应该重新构建你的应用程序,将模型与控制器分开。阅读MVC。

    我还建议您使用单个结构来管理所有这些数据,而不是维护多个数组(即歌曲,艺术家,tna)。阅读Swift结构。

    TableViewController1不是控制器名称的最佳选择。也许SongListTableViewController更清楚?