数组索引超出iOS范围

时间:2016-03-20 20:55:55

标签: ios arrays swift

大家好,我一直坚持错误'数组索引超出范围'。我从互联网上获取JSON数据并将其转换为数组。我一直在加载评论(注意:我发布了这个问题,因为我无法找到与我的问题相关的任何问题)

所以我一直在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

并且comments变量定义如下。

var comments : [Comment] = Comment

loadComments方法返回注释,如日志

所示

The log which shows comments is not nil

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
}

随时问我更多代码。

提前致谢 雅利安

2 个答案:

答案 0 :(得分: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

如果您的评论数量 0 ,您的乐趣 cellForRowAtIndexPath 将调用 9 次! 使用

comments.count

或在代码中添加一些检查。

答案 1 :(得分:0)

以下是继续操作的方法。

创建一个评论类:

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

创建用户类:

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

然后在你的for循环中将Json解析为Comment对象,然后将其添加到comments数组:

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)
     }

这应该是它。

相关问题