Ios XCode Swift 3 UITableViewController单元不';不显示
我正在从itunes api导出json文件>将其转换为json文件>将其发送到firebase>将其放入字典文件,现在我正在尝试将其放入tableview,但它似乎不起作用,我不知道为什么。我检查了一下: 1.我导入的文件已成功转换为字典。 2.数据源和委托已连接到此UITableViewController文件。 3.放置其他阵列以检查我的连接是否正确(如果我使用Firebase带来的数据,它会工作,但根本不工作) 4.我把单元格样式作为副标题,键入动态 以下是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
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(),那么一旦填充了数据,就会导致表视图刷新
可选地,你可以考虑重新构建你的应用程序,这样它就有一个单独的模型组件负责数据检索,这样数据就可以在视图启动之前被填充。如果你的代码是这样做的:
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
更清晰?您可以省略“请帮助”的内容。我们都知道问堆栈溢出问题的目的是什么。非常感谢您,这澄清了很多。该名称仅用于试验目的,我有一个不同的控制器,具有不同的名称:)。很高兴它澄清了问题,如果有帮助,请随时接受答案。谢谢