2016-03-20 75 views
0

嗨,大家好,我一直被卡住的錯誤'數組索引超出範圍'。我從互聯網獲取JSON數據並將其轉換爲數組。我一直在加載評論(注:我發佈了這個問題,因爲我無法找到任何問題與我的問題有關)陣列索引超出範圍iOS

所以我一直在加載註釋在jsonData中。我一直用來加載評論的代碼是這樣的。

api.loadComments(shot.commentsUrl, completion: didLoadComments) 

完成的代碼是這樣的。

func didLoadComments(comments : [Comment]){ 
    self.comments = comments 
    self.tableView.reloadData() 
} 

它在定義的tableView ...

let cell = tableView.dequeueReusableCellWithIdentifier("Cell10", forIndexPath: indexPath) as! CommentCell 

//This is where the error occurs 
let comment = comments[indexPath.row] 
cell.nameLabel.text = comment.user.name 
cell.commentLabel.text = comment.body 
cell.avatarImageView.sd_setImageWithURL(NSURL(string: comment.user.avatarUrl), placeholderImage: UIImage(named: "2")) 
return cell 

和評論變量的定義如下。如圖所示,日誌

The log which shows comments is not nil

爲loadComments的代碼是在此

var comments : [Comment] = Comment 

loadComments方法正在返回的意見。

func loadComments(commentsUrl: String, completion: (([Comment]) -> Void)!) { 
let urlString = commentsUrl + "?access_token=" + Config.ACCESS_TOKEN 

let session = NSURLSession.sharedSession() 
let url = NSURL(string: urlString) 
let task = session.dataTaskWithURL(url!) { 
    (data, response, error) -> Void in 
    if error != nil { 
     print(error!.localizedDescription) 
    } else { 
     var comments = [Comment]() 
     do { 
     let commentsData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray 
     for commentData in commentsData { 
      let comment = Comment(data: commentData as! NSDictionary) 
      comments.append(comment) 
     } 
     } 
     catch { 
     } 

     let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
     dispatch_async(dispatch_get_global_queue(priority, 0)) { 
     dispatch_async(dispatch_get_main_queue()) { 
      completion(comments) 
     } 
     } 
    } 
    task.resume() 
} 

numberOfRowsInSection看起來像這樣。

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete implementation, return the number of rows 
    return 9 + comments.count 
} 

隨意問我任何更多的代碼。

在此先感謝 雅利安

+0

如果它表示索引超出範圍,請打印您的'indexPath.row'並在錯誤發生時檢查它。 –

+0

調查這個最簡單的方法是放置一個斷點。然後,您可以檢查並驗證「comments」是否是您期望的那樣... – Alladinian

+0

您在哪裏調用loadComments函數? – emresancaktar

回答

0

這個問題的原因是:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return comments.count 
} 

該方法返回的項目數。並且您的方法

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! CommentCell 


     return cell 
    } 

將在此列表中的每個項目的週期中運行。 您應該檢查的項目在方法「numberOfRowsInSection」數和物品「的cellForRowAtIndexPath」 算

編輯:

當然,你做到了。

return 9 + comments.count 

如果您的意見數將你的樂趣的cellForRowAtIndexPath將調用倍! 使用

comments.count 

或在代碼中添加一些檢查。

+0

我認爲沒有必要檢查計數。如果計數爲0,那麼cellforrow甚至不會被調用。所以cellforrow將被稱爲我們擁有的數量。 –

+0

我已編輯顯示numberOfRowsInSection的答案,因爲它返回我想要的時候我把佔位符文本和圖像.. –

+0

添加更多「numberOfRowsInSection」它很容易理解什麼是錯的 –

0

下面介紹如何繼續操作。

創建批註類:

class Comment { 
    var user: User? 
    var commentLabel: String? 
} 

創建一個User類:

class User { 
    var name: String? 
    var avatarUrl: UIImageView? 
} 

然後在你的for循環解析JSON成註釋對象,然後將它添加到評論陣列:

for commentData in commentsData { 
     let commentDictionary = Comment(data: commentData as! NSDictionary) 
      var temp:NSArray = commentDictionary["user"] as! NSArray 
      var user: User? 
      user.name = temp["name"] 
      user.avatarUrl = temp["avatarUrl"] 
      var comment: Comment? 
      comment.commentLabel = commentDictionary["body"] 
     comments.append(comment) 
    } 

這應該是它。

+0

'struct'實際上比'class'更適合這個目的。 –