Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 数组索引超出范围_Ios_Arrays_Swift - Fatal编程技术网

Ios 数组索引超出范围

Ios 数组索引超出范围,ios,arrays,swift,Ios,Arrays,Swift,嗨,伙计们,我一直被错误“数组索引超出范围”困扰着。我从互联网上获取JSON数据,并将其转换为一个数组。我一直在加载评论(注意:我已经发布了这个问题,因为我找不到任何与我的问题相关的问题) 所以我一直在jsonData中加载注释。我用来加载注释的代码如下 api.loadComments(shot.commentsUrl, completion: didLoadComments) func loadComments(commentsUrl: String, completion: (([Com

嗨,伙计们,我一直被错误“数组索引超出范围”困扰着。我从互联网上获取JSON数据,并将其转换为一个数组。我一直在加载评论(注意:我已经发布了这个问题,因为我找不到任何与我的问题相关的问题)

所以我一直在jsonData中加载注释。我用来加载注释的代码如下

api.loadComments(shot.commentsUrl, completion: didLoadComments)
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()
}
完成的代码是这样的

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
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   // #warning Incomplete implementation, return the number of rows
   return 9 + comments.count
}
loadComments
方法返回日志中显示的注释

loadComments的代码如下所示

api.loadComments(shot.commentsUrl, completion: didLoadComments)
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()
}
NumberOfRowsin部分如下所示

var comments : [Comment] = Comment
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   // #warning Incomplete implementation, return the number of rows
   return 9 + comments.count
}
请随时向我索取更多的代码

提前谢谢
雅利安人这个问题的原因是:

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次!!! 使用


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

以下是您可以继续操作的方法

创建注释类:

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

应该是这样。

如果它说索引超出范围,请打印
indexath.row
,并在错误发生时检查它。最简单的调查方法是设置断点。然后,您可以检查并验证
comments
是否符合您的预期…您在哪里调用loadComments函数?检查didLoadComments函数中self.comments的值。。。它是否返回任何内容。我认为这里的问题是解析数据,您需要迭代json,创建comment对象,然后将其添加到comments add。。然后只有在cellforrow中才能提取它。我在viewDidLoad@emresancaktarI中调用loadComments,我认为没有必要检查计数。如果计数为0,则甚至不会调用cellforrow。因此cellforrow将被称为我们拥有的NumberOfCount。我编辑了答案以显示numberOfRowsInSection,因为当我放置占位符文本和图像时,它返回我想要的内容。添加更多“numberOfRowsInSection”后,如果动态更改注释,很容易理解有什么问题,计数也不例外)如果你从服务器得到12条评论,你会返回9+12项吗?为什么?U总是会出现此错误。
struct
确实比
更能达到此目的。