解析不在表视图中加载第一张图像
parse not loading first images in tableview
我正在使用解析来存储和检索一些数据,然后我将这些数据加载到 UITableview 中,每个单元格都包含一些文本和图像,但是当我打开我的 tableview 时,视图中的任何单元格都不会显示图像,直到我将它们滚动出视图并返回视图(我猜这是调用 cellForRowAtIndexPath)。有没有办法检查所有图像何时下载,然后重新加载 tableview?
func loadData(){
self.data.removeAllObjects()
var query = PFQuery(className:"Tanks")
query.orderByAscending("createdAt")
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]!, error: NSError!) -> Void in
if error == nil {
// The find succeeded.
for object in objects {
self.data.addObject(object)
}
} else {
// Log details of the failure
NSLog("Error: %@ %@", error, error.userInfo!)
}
self.tableView.reloadData()
}
}
override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell {
self.cell = tableView!.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath!) as TankTableViewCell // let cell:TankTableViewCell
let item:PFObject = self.data.objectAtIndex(indexPath!.row) as PFObject
self.cell.productName.alpha = 1.0
self.cell.companyName.alpha = 1.0
self.cell.reviewTv.alpha = 1.0
self.rating = item.objectForKey("rating") as NSNumber
cell.productName.text = item.objectForKey("prodName") as? String
cell.companyName.text = item.objectForKey("compName") as? String
self.cell.reviewTv.text = item.objectForKey("review") as? String
let userImageFile = item.objectForKey("image") as PFFile
userImageFile.getDataInBackgroundWithBlock({
(imageData: NSData!, error: NSError!) -> Void in
if (error == nil) {
let image = UIImage(data:imageData)
self.cell.productImage.image = image
}
}, progressBlock: {
(percentDone: CInt) -> Void in
if percentDone == 100{
}
})
self.setStars(self.rating)
// Configure the cell...
UIView.animateWithDuration(0.5, animations: {
self.cell.productName.alpha = 1.0
self.cell.companyName.alpha = 1.0
self.cell.reviewTv.alpha = 1.0
self.cell.reviewTv.scrollRangeToVisible(0)
})
return cell
}
您可以在 UITableViewController 中设置一个委托方法,该方法由另一个控制器 class 调用以获取图像。我怀疑那是你想要做的。
您应该做的是使用默认图像初始化单元格,让单元格控制器本身在后台获取图像,并在获取完成时更新其 UIImageView。您绝对不想在重新加载 table 之前等待所有图像加载完毕,因为 a.) 这需要很长时间,并且 b.) 如果失败或超时怎么办?
一旦单元格加载了它的图像,如果它被回收器换出并换回,你可以通过调用 getData
而不是 getDataInBackground
来简单地获取缓存图像,只要isDataAvailable
是真的。
问题是您使用了 self.cell
并且每次返回单元格时您都更改了该引用。因此,当加载图像时,它们都被设置到要返回的最后一个单元格中,该单元格可能不在屏幕上(或至少未完全显示)。
实际上,您应该在图像下载的完成块中捕获单元格(并检查单元格是否仍链接到相同的索引路径)。
此外,您应该缓存下载的图像,这样您就不会总是下载数据/重新创建图像。
在你的行之后:
self.cell.productImage.image = image
尝试添加:
cell.layoutSubviews()
或 self.cell.layoutSubviews()
它应该在第一个 table 视图上呈现子视图,在本例中是您的图像。
我正在使用解析来存储和检索一些数据,然后我将这些数据加载到 UITableview 中,每个单元格都包含一些文本和图像,但是当我打开我的 tableview 时,视图中的任何单元格都不会显示图像,直到我将它们滚动出视图并返回视图(我猜这是调用 cellForRowAtIndexPath)。有没有办法检查所有图像何时下载,然后重新加载 tableview?
func loadData(){
self.data.removeAllObjects()
var query = PFQuery(className:"Tanks")
query.orderByAscending("createdAt")
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]!, error: NSError!) -> Void in
if error == nil {
// The find succeeded.
for object in objects {
self.data.addObject(object)
}
} else {
// Log details of the failure
NSLog("Error: %@ %@", error, error.userInfo!)
}
self.tableView.reloadData()
}
}
override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell {
self.cell = tableView!.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath!) as TankTableViewCell // let cell:TankTableViewCell
let item:PFObject = self.data.objectAtIndex(indexPath!.row) as PFObject
self.cell.productName.alpha = 1.0
self.cell.companyName.alpha = 1.0
self.cell.reviewTv.alpha = 1.0
self.rating = item.objectForKey("rating") as NSNumber
cell.productName.text = item.objectForKey("prodName") as? String
cell.companyName.text = item.objectForKey("compName") as? String
self.cell.reviewTv.text = item.objectForKey("review") as? String
let userImageFile = item.objectForKey("image") as PFFile
userImageFile.getDataInBackgroundWithBlock({
(imageData: NSData!, error: NSError!) -> Void in
if (error == nil) {
let image = UIImage(data:imageData)
self.cell.productImage.image = image
}
}, progressBlock: {
(percentDone: CInt) -> Void in
if percentDone == 100{
}
})
self.setStars(self.rating)
// Configure the cell...
UIView.animateWithDuration(0.5, animations: {
self.cell.productName.alpha = 1.0
self.cell.companyName.alpha = 1.0
self.cell.reviewTv.alpha = 1.0
self.cell.reviewTv.scrollRangeToVisible(0)
})
return cell
}
您可以在 UITableViewController 中设置一个委托方法,该方法由另一个控制器 class 调用以获取图像。我怀疑那是你想要做的。
您应该做的是使用默认图像初始化单元格,让单元格控制器本身在后台获取图像,并在获取完成时更新其 UIImageView。您绝对不想在重新加载 table 之前等待所有图像加载完毕,因为 a.) 这需要很长时间,并且 b.) 如果失败或超时怎么办?
一旦单元格加载了它的图像,如果它被回收器换出并换回,你可以通过调用 getData
而不是 getDataInBackground
来简单地获取缓存图像,只要isDataAvailable
是真的。
问题是您使用了 self.cell
并且每次返回单元格时您都更改了该引用。因此,当加载图像时,它们都被设置到要返回的最后一个单元格中,该单元格可能不在屏幕上(或至少未完全显示)。
实际上,您应该在图像下载的完成块中捕获单元格(并检查单元格是否仍链接到相同的索引路径)。
此外,您应该缓存下载的图像,这样您就不会总是下载数据/重新创建图像。
在你的行之后:
self.cell.productImage.image = image
尝试添加:
cell.layoutSubviews()
或 self.cell.layoutSubviews()
它应该在第一个 table 视图上呈现子视图,在本例中是您的图像。