如何将UIImages添加到PFFile数组中,以便在查询PFFile映像失败时,可以通过附加UIImage来替换它



从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

相关内容

最新更新