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