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 不显示数据的主要内容,如果未能解决你的问题,请参考以下文章

TableView 不显示数据

tableView 不显示我的数据

javafx tableView 不显示数据,getter setter 有啥问题?

重新启动应用程序后tableview不显示tableview中的所有数据

CollectionView 内的 iOS TableView 有时会显示不正确的数据

tableView Cell 不显示数据,这是啥问题? (斯威夫特 3)