TableView 不显示数据
Posted
技术标签:
【中文标题】TableView 不显示数据【英文标题】:TableView does not show data 【发布时间】:2017-07-27 14:36:47 【问题描述】:我正在尝试用从 GET 请求中收到的一些数据填充我的UITableView
。我不知道为什么,但如果在我的numberOfRowsInSection
中,我返回一个特定值(例如 8),它代表信息。如果 y 返回请求填充的我的数组的值,UITableView
不会添加任何行:
class DashboardTableViewController: UITableViewController
var userData = [String]()
var secondUserData = [String]()
var name: String = ""
override func viewDidLoad()
super.viewDidLoad()
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
/* This function gets the user account information from a JSON in a simple request */
private func loadUserData(completion: @escaping (_ myArray: [String]) -> Void)
let session = Twitter.sharedInstance().sessionStore.session()
let client = TWTRAPIClient.withCurrentUser()
let userInfoURL = "https://api.twitter.com/1.1/users/show.json"
let params = ["user_id": session?.userID]
var clientError : NSError?
let request = client.urlRequest(withMethod: "GET", url: userInfoURL, parameters: params, error: &clientError)
client.sendTwitterRequest(request) (response, data, connectionError) -> Void in
if connectionError != nil
print("Error: \(connectionError)")
do
let json = JSON(data: data!)
if let userName = json["name"].string,
let description = json["description"].string,
let followersCount = json["followers_count"].int,
let favouritesCount = json["favourites_count"].int,
let followingCount = json["friends_count"].int,
let lang = json["lang"].string,
let nickname = json["screen_name"].string
self.userData.append(userName)
self.userData.append(nickname)
self.userData.append(String(followersCount))
self.userData.append(String(followingCount))
self.userData.append(String("22"))
self.userData.append(lang)
self.userData.append(description)
self.userData.append("No country")
completion(self.userData)
/* This closure helps us to fill the labels once the request has been finished in loadUserData */
func manageUserData(label: UILabel, index: Int)
loadUserData
(result: [String]) in
label.text = result[index]
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int
// #warning Incomplete implementation, return the number of sections
return 1
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
// #warning Incomplete implementation, return the number of rows
return self.userData.count
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let rowNumber = indexPath.row
let cellIdentifier = "TableViewCell"
guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? TableViewCellController else
fatalError("The dequeued cell is not an instance of TableViewCellController.")
switch rowNumber
case 0:
cell.titlePlaceholder.text = "Name:"
manageUserData(label: cell.valuePlaceholder, index: rowNumber)
case 1:
cell.titlePlaceholder.text = "Nickname:"
manageUserData(label: cell.valuePlaceholder, index: rowNumber)
case 2:
cell.titlePlaceholder.text = "Followers:"
manageUserData(label: cell.valuePlaceholder, index: rowNumber)
case 3:
cell.titlePlaceholder.text = "Following:"
manageUserData(label: cell.valuePlaceholder, index: rowNumber)
case 4:
cell.titlePlaceholder.text = "Tweets:"
manageUserData(label: cell.valuePlaceholder, index: rowNumber)
case 5:
cell.titlePlaceholder.text = "Language:"
manageUserData(label: cell.valuePlaceholder, index: rowNumber)
case 6:
cell.titlePlaceholder.text = "Biography:"
manageUserData(label: cell.valuePlaceholder, index: rowNumber)
case 7:
cell.titlePlaceholder.text = "Country:"
manageUserData(label: cell.valuePlaceholder, index: rowNumber)
default:
cell.titlePlaceholder.text = "?"
cell.valuePlaceholder.text = "?"
return cell
知道为什么会这样吗? 非常感谢!!
更新!
我在 loadUserData() 函数中添加 self.tableView.reloadData() 后解决了这个问题。希望对您有所帮助!
【问题讨论】:
在override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
开头添加断点,检查是否调用了这个方法
这是关于您的要求。尝试在let json = JSON(data: data!)
之后立即打印您的 json,看看会发生什么
只有在我在 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 中返回特定值的情况下,它才会执行这两项操作。
从 API 完成下载数据后尝试tableView.reloadData()
已经尝试使用 self.tableView.realoadData() 如果我在 numberOfRowsInSection 函数中返回数组的计数,它仍然不会加载它
【参考方案1】:
快速解决方案:
tableView.reloadData()
如果你不是从主线程调用它:
DispatchQueue.main.async
self.tableView.reloadData()
【讨论】:
已经尝试使用 self.tableView.realoadData() 如果我在 numberOfRowsInSection 函数中返回数组的计数,它仍然不会加载它 你在代码的哪里重新加载 tableView ? 我尝试在完成请求后立即执行此操作 那么你必须在我的答案中使用代码 DispatchQueue.main.async 还是不行。这真的很奇怪。不明白为什么只有当我在 numberOfRowsInSection 函数中返回一个特定数字时才会收取数据费用【参考方案2】:收到请求后必须重新加载表视图数据
[self.tableView reloadData];
【讨论】:
已经尝试使用 self.tableView.realoadData() 如果我在 numberOfRowsInSection 函数中返回数组的计数,它仍然不会加载它以上是关于TableView 不显示数据的主要内容,如果未能解决你的问题,请参考以下文章
javafx tableView 不显示数据,getter setter 有啥问题?
重新启动应用程序后tableview不显示tableview中的所有数据