我从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 },
.....
}
答案 0 :(得分:1)
observeSingleEvent()是异步的,并且在observeSingleEvent()完成填充数据之前将调用numberOfRowsInSection()。 如果在第二个for循环之后调用self.tableView.reloadData(),那么一旦填充了数据,这将导致刷新表视图。
或者,您可以考虑重新设计应用程序,使其具有负责数据检索的单独模型组件,以便在视图启动之前填充数据(如果适用)。
答案 1 :(得分:0)
您的代码正在执行此操作:
在这个方法之后你应该像这样添加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
更清楚?