嗨,大家好,最近出现了从Dribble获取数据的错误。
我的Dribbble客户端IOS在主屏幕上显示镜头,如果您单击collectionView单元,它将带您到镜头的细节。
我正在使用此方法通过其api获取Dribble Data。
getShots方法的代码
class func getShots(url: String, callback:(([Shot]) -> Void)){
var shots = [Shot]()
let url = url + "&access_token=" + Config.ACCESS_TOKEN
HttpService.getJSON(url){ (jsonData) -> Void in
for shotData in jsonData {
let shot = Shot(data: shotData as! NSDictionary)
shots.append(shot)
}
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0), { () -> Void in
dispatch_async(dispatch_get_main_queue(), { () -> Void in
callback(shots)
})
})
}
}
getJSON方法的代码。
class HttpService {
class func getJSON(url: String, callback:((NSArray) -> Void)) {
let nsURL = NSURL(string: url)!
Alamofire.request(.GET, nsURL).response { (request, response, data, error) -> Void in
if error != nil{
print("error")
}
if data != nil {
let jsonData = (try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)) as! NSArray
callback(jsonData)
}
}
}
}
上面的代码可以成功加载Shot JSON数据。
因此,当我在self.shots = shots行上对其进行调试时,它将返回如下内容。
The log when debugging on the self.shots = shots line
一切正常..以及“镜头细节”类的代码...
我一直在使用动态tableView来显示击球细节
ShotDetail中的代码是为标签分配文本的代码。基本上是TableView数据源方法。
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 2
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
if section == 0 {
return 9
} else {
return comments.count
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if indexPath.section == 0 {
if indexPath.row == 0 {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell1", forIndexPath: indexPath) as! vlcTableViewCell
// Configure the cell
// the views . likes. and the comment Count label are allocated
cell.viewsCount.text = "\(shot.viewsCount)"
cell.likesCount.text = "\(shot.likesCount)"
cell.commentCount.text = "\(shot.commentCount)"
return cell
} else if indexPath.row == 1 {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell2", forIndexPath: indexPath) as! descCell
// Configure the Cell
// the text for the labels
cell.usernameLabel.text = "\(shot.user.username)"
cell.descriptionLabel.text = "\(shot.description)"
cell.profileImageView.sd_setImageWithURL(NSURL(string: shot.user.avatarUrl), placeholderImage: UIImage(named: "2"))
return cell
} else if indexPath.row == 2 {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell4", forIndexPath: indexPath) as! teamCell
if shot.team == nil{
cell.teamNameLabel.text = "Team"
} else {
cell.teamNameLabel.text = "\(shot.team.name)"
}
return cell
} else if indexPath.row == 4 {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell5", forIndexPath: indexPath) as! reboundShotsCount
cell.reboundCountLabel.text = "\(shot.reboundCount)"
return cell
} else {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell10", forIndexPath: indexPath) as! CommentCell
let comment = comments[indexPath.row]
cell.nameLabel.text = comment.user.name
cell.commentLabel.text = comment.body
cell.avatarImageView.alpha = 0.0
cell.avatarImageView.sd_setImageWithURL(NSURL(string: comment.user.avatarUrl), placeholderImage: UIImage(named: "2"), completed: { (image, error, cacheType, url) -> Void in
cell.avatarImageView.alpha = 1.0
// Animate the imageView after the image is loaded
cell.animationView.layer.cornerRadius = 25
cell.animationView.delay = 0
cell.animationView.duration = 0.5
cell.animationView.type = "popAlpha"
cell.animationView.startCanvasAnimation()
})
cell.dateLabel.text = comment.date
return cell
}
}
以及Shot类的代码。从这里我可以将所有数据设置为标签
import Foundation
class Shot: DribbbleBase {
var imageUrl : String!
var htmlUrl : String!
var commentsUrl : String!
var bucketsUrl : String!
var likesUrl : String!
var attachmentUrl : String!
var reboundUrl : String!
var title : String!
var date : String!
var description : String!
var commentCount : Int!
var viewsCount : Int!
var likesCount : Int!
var bucketsCount : Int!
var attachmentsCount : Int!
var reboundCount : Int!
var imageUrll : String!
var teamUrl : String!
var user : User!
var team : Team!
override init(data: NSDictionary) {
super.init(data: data)
self.commentCount = data["comments_count"] as! Int
self.likesCount = data["likes_count"] as! Int
self.viewsCount = data["views_count"] as! Int
self.bucketsCount = data["buckets_count"] as! Int
self.attachmentsCount = data["attachments_count"] as! Int
self.reboundCount = data["rebounds_count"] as! Int
self.commentsUrl = Utils.getStringFromJSON(data, key: "comments_url")
self.bucketsUrl = Utils.getStringFromJSON(data, key: "buckets_url")
self.likesUrl = Utils.getStringFromJSON(data, key: "likes_url")
self.title = Utils.getStringFromJSON(data, key: "title")
self.attachmentUrl = Utils.getStringFromJSON(data, key: "attachments_url")
self.reboundUrl = Utils.getStringFromJSON(data, key: "rebounds_url")
self.teamUrl = Utils.getStringFromJSON(data, key: "teams_url")
let dateInfo = Utils.getStringFromJSON(data, key: "created_at")
self.date = Utils.formatDate(dateInfo)
let desc = Utils.getStringFromJSON(data, key: "description")
self.description = Utils.stripHTML(desc)
let images = data["images"] as! NSDictionary
self.imageUrl = Utils.getStringFromJSON(images, key: "normal")
self.imageUrll = Utils.getStringFromJSON(images, key: "hidpi")
let tags = data["tags"] as! NSArray
if let userData = data["user"] as? NSDictionary {
self.user = User(data: userData)
}
if let teamData = data["team"] as? NSDictionary {
self.team = Team(data: teamData)
}
}
}
现在,当我点击该单元格转到下一个单元格时,就会出现问题。
在此之前,如果我在Shot类中进行调试。
数据看起来像这样
The Log Which shows the data returned
现在,每当我单击单元格时。去细节。数据仅返回7个确切值,而第一个值恰好是返回所有需要的值。
我用来在PopularShotsCollectionViewController中推送数据的代码是这个。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "1"){
let selectedItems = collectionView!.indexPathsForSelectedItems()
if let sItem = selectedItems as [NSIndexPath]!{
let shot = shots[sItem[0].row]
let controller = segue.destinationViewController as! ShotDetail
controller.shot = shot
}
}
}
但是日志中只返回7值。
https://www.dropbox.com/s/4vkgg7a3f44fg35/Screen%20Shot%202016-03-28%20at%2014.40.23.png?dl=0
我将链接放在代码块中,因为我不能发布两个以上的链接。
任何帮助将不胜感激..
谢谢
雅利安人
最佳答案
let shot = shots [sItem [0] .row]可能是问题所在。您正在将相同的索引传递给DetailVC
。您可以保存所选镜头的数组,然后将其传递到DetailVC
中的镜头变量(如果镜头变量是shots
的数组)
var selectedIndex = NSIndexPath()
override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
selectedIndex = indexPath
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "1"){
let selectedItems = collectionView!.indexPathsForSelectedItems()
let selectedShots = shots[selectedIndex.row]
let controller = segue.destinationViewController as! ShotDetail
controller.shot = selectedShots
}
}
}