大家好,我一直坚持错误'数组索引超出范围'。我从互联网上获取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
}
随时问我更多代码。
提前致谢 雅利安
答案 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)
}
这应该是它。