从Parse中检索图像并将其显示在tableView上。如果我向下滚动tableView,应用程序将崩溃并给我"致命错误:数组索引超出范围"
行数由"messagesArray"中的消息数给定
我认为问题是,在查询中,如果我在指针中找不到图像,我会说"将我的标准UIImage
添加到PFFile
数组中,称为"徽标",所以当我向下滚动时,图像数组和消息数组的计数不起作用。
如何将UIImages添加到PFFile数组中,以便在查询PFFile映像失败时,可以通过附加UIImage来替换它
有些人告诉我对dispatch_async(dispatch_get_main_queue()) {}
中的图像进行单独查询
但是主查询是这样调用的。
我有这个阵列:
var picturesArray : [PFFile] = []
在cellForRowAtIndexPath
中,我有:
self.picturesArray[indexPath.row].getDataInBackgroundWithBlock { (imageData: NSData?, error:NSError?) -> Void in
if error == nil {
let image = UIImage(data: imageData!)
cell.senderProfileImage?.image = image
} else {
print("plan B")
cell.senderProfileImage?.image = UIImage(named: "logo")
}
}
在我的查询中,我可以通过查询带有指向_Users
的指针的"sender"列来检索发件人的名称。我有:
if let theName = singleObject.objectForKey("sender")?.objectForKey("first_name") as? String {
// this retrieves names from pointer "sender" in "Messages"
self.sendersArray.append(theName) //populate the array with names
} else {
if let messageSender = singleObject["senderNickname"] as? String {
self.sendersArray.append(messageSender)
}
}
if let profilePicture = singleObject.objectForKey("sender")?.objectForKey("profile_picture") as? PFFile {
self.picturesArray.append(profilePicture)
} else {
//I think this is the problem:
print("no image found in pointer to users")
self.picturesArray.append(UIImage(named: "logo"))
}
解决方案:
目前,还需要修复这个错误(希望苹果和Parse迟早会解决它们)
//very new, it's ok
if let theName = singleObject.objectForKey("sender")?.objectForKey("first_name") as? String {
// this retrieves names from pointer "sender" in "Messages"
self.sendersArray.append(theName) //populate the array with names
} else {
if let messageSender = singleObject["senderNickname"] as? String {
self.sendersArray.append(messageSender)
}
}
//very new : this fix fatal error: Array index out of range
if let profilePicture = singleObject.objectForKey("sender")?.objectForKey("profile_picture") as? PFFile {
self.picturesArray.append(profilePicture)
} else {
//I think this is the problem:
print("no image found in pointer to users")
// self.picturesArray.append(UIImage(named: "logo"))
let imageData:NSData = UIImagePNGRepresentation(UIImage(named: "logo")!)!
self.picturesArray.append(PFFile(data: imageData))
}
和
//this fixes the crash related to different number of rows and images
if indexPath.row < picturesArray.count {
self.picturesArray[indexPath.row].getDataInBackgroundWithBlock { (imageData: NSData?, error:NSError?) -> Void in
if error == nil {
let image = UIImage(data: imageData!)
cell.senderProfileImage?.image = image
}
}
} else {
// cell.senderProfileImage?.image = UIImage(named: "logo")
print("no foto!")
}
您的应用程序正在崩溃,因为您的表视图单元格比图片中的图片多Array
只需检查indexPath.row<picturesArray.count使用picturesAarray[x]之前
if indexPath.row < picturesArray.count {
self.picturesArray[indexPath.row].getDataInBackgroundWithBlock { (imageData: NSData?, error:NSError?) -> Void in
if error == nil {
let image = UIImage(data: imageData!)
cell.senderProfileImage?.image = image
}
}
} else {
cell.senderProfileImage?.image = UIImage(named: "logo")
}
编辑:
如果您想将带有徽标图像的PFFile附加到picturesArray中,您可以执行以下
let imageData:NSData = UIImagePNGRepresentation(UIImage(named: "imagename")!)!
self.picturesArray.append(PFFile(data: imageData))
而不是
self.picturesArray.append(UIImage(named: "logo"))
说明:
在self.picturesArray.append(UIImage(named: "logo"))
中,您试图将UIImage
对象添加到只接受PFFile
对象的数组中,正如您在这里声明的那样:var picturesArray : [PFFile] = []
您需要实例化一个新的PFFile
并向其中添加一个UIImage
,但PFFile
初始化程序只接受NSData
进行存储。
因此,要将UIImage
转换为NSData
,可以使用UIImagePNGRepresentation
,然后用图像数据实例化PFFile
。