2017-07-27 60 views
0

我想填充我的UITableView与我从GET请求收到的一些数据。我不知道为什么,但如果在我的numberOfRowsInSection中,我返回一个特定值(例如8)它代表信息。若y回到我的数组被要求填写的值,则UITableView不添加任何行:TableView不显示数据

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()函数内的completion()之后添加self.tableView.reloadData()。希望能帮助到你!

+0

添加覆盖func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath)开始处的断点 - > UITableViewCell {' 检查此方法是否被称为 – Maxime

+0

这是关于您的请求。尝试在'let json = JSON(data:data!)'后面打印你的json,看看会发生什么 – GIJOW

+0

它只有在我在override func tableView中返回一个特定值时才会执行这两个操作(_ tableView:UITableView,numberOfRowsInSection section:Int ) - > Int –

回答

2

斯威夫特解请求后,必须重新加载表视图数据:

tableView.reloadData() 

如果不从主线程调用它:

DispatchQueue.main.async { 
    self.tableView.reloadData() 
} 
+0

已尝试使用self.tableView.realoadData(),它仍然不会加载它如果我在numberOfRowsInSection函数中返回了我的数组的数量 –

+1

代码中的哪里重载了tableView? – Phyber

+0

我已经试过在完成后在做请求的方法中执行此操作 –

0

接收与

[self.tableView reloadData]; 
+0

已经尝试使用self.tableView.realoadData(),它仍然不加载它,如果我在numberOfRowsInSection函数返回我的数组的计数 –