Ios XCode Swift 3 UITableViewController单元不';不显示

Ios XCode Swift 3 UITableViewController单元不';不显示,ios,xcode,uitableview,swift3,Ios,Xcode,Uitableview,Swift3,我正在从itunes api导出json文件>将其转换为json文件>将其发送到firebase>将其放入字典文件,现在我正在尝试将其放入tableview,但它似乎不起作用,我不知道为什么。我检查了一下: 1.我导入的文件已成功转换为字典。 2.数据源和委托已连接到此UITableViewController文件。 3.放置其他阵列以检查我的连接是否正确(如果我使用Firebase带来的数据,它会工作,但根本不工作) 4.我把单元格样式作为副标题,键入动态 以下是UITableViewCont

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

以下是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 }, 
  .....
}
observeSingleEvent()是异步的,将在observeSingleEvent()完成数据填充之前调用numberOfRowsInSection()。 如果在第二个for循环之后调用self.tableView.reloadData(),那么一旦填充了数据,就会导致表视图刷新


可选地,你可以考虑重新构建你的应用程序,这样它就有一个单独的模型组件负责数据检索,这样数据就可以在视图启动之前被填充。如果你的代码是这样做的:

  • viewDidLoad
  • 启动firebase异步
  • 询问tableview的节数/行数
  • song.count为0
  • tableview加载时没有单元格
  • firebase async完成并填充歌曲数组
  • 。。。没有别的了
  • 在此方法之后,应添加tableView重载数据,如下所示:

        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

    我还建议您不用维护多个数组(如song、artist、tna),而是使用单个结构来管理所有这些数据。阅读Swift结构


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

    您可以省略“请帮助”的内容。我们都知道问堆栈溢出问题的目的是什么。非常感谢您,这澄清了很多。该名称仅用于试验目的,我有一个不同的控制器,具有不同的名称:)。很高兴它澄清了问题,如果有帮助,请随时接受答案。谢谢