UIImagePickerController 关闭后 UICollectionView 不会 reloadData()

Posted

技术标签:

【中文标题】UIImagePickerController 关闭后 UICollectionView 不会 reloadData()【英文标题】:UICollectionView won't reloadData() after UIImagePickerController dismisses 【发布时间】:2015-12-19 03:05:56 【问题描述】:

我有一个小问题,在从 UIImagePickerController 选择图像后(并保存到 Parse,因为我的 UICollectionView 从我在 Parse 上的图像填充),我的 UICollectionView 将不会加载新保存的图像,直到我离开该 viewController 并返回它。我已经尝试了几乎所有我能想到的解决方法。我应该把我的代码放在哪里来保存和关闭控制器?

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) 

    let imagePicture = UIImageJPEGRepresentation(image, 0.1)
    let imageFile = PFFile(name: "imageFile.jpg", data: image)

    let saveImage = PFObject(className: "Gallery")
    saveImage["imageFile"] = imageFile
    saveImage["dogName"] = self.dogSelectedName
    saveImage["userID"] = PFUser.currentUser()?.objectId
    saveImage["dogID"] = self.dogObjectID
    saveImage.saveInBackgroundWithBlock  (Bool, error) -> Void in
        if error != nil 
            print("There was an error")
         else 
            print("New Gallery object saved: \(saveImage)")
        
    

    self.collectionView.reloadItemsAtIndexPaths(self.collectionView.indexPathsForVisibleItems())
    self.collectionView.reloadData()

    self.dismissViewControllerAnimated(true)  () -> Void in

调试后,我注意到很多时候它会在视图出现后保存我的对象(或者取决于我编写代码的位置,在视图出现之前),并且在我离开并回来之前仍然不会重新加载集合视图。我放了:

dispatch_async(dispatch_get_main_queue())  () -> Void in
        self.collectionView.reloadData()
    

在我的代码中的多个位置,但结果仍然相同。我还能/应该如何设置它?任何帮助都是很大的帮助!!谢谢。

【问题讨论】:

你用什么函数来填充你的UICollectionView 让 findPhotos = PFQuery(className: "Gallery") findPhotos.whereKey("dogID", equalTo: self.dogObjectID) findPhotos.orderByDescending("createdAt") findPhotos.findObjectsInBackgroundWithBlock (objects, error) -> 如果让用户 = 对象 对于用户中的对象 self.photoData.addObject(object) self.collectionView.reloadData() print("Fetched (self.dogSelectedName)'s (self.photoData.count) Images" ) 这一切都在一个名为lookUpForPhotos() 的函数中,该函数在viewDidLoad 上调用 【参考方案1】:

您的lookUpPhotos 函数很好,但您可以在查询结束时更新collectionView

func lookUpPhotos() 

    let findPhotos = PFQuery(className: "Gallery")
    findPhotos.whereKey("dogID", equalTo: self.dogObjectID)
    findPhotos.orderByDescending("createdAt")
    findPhotos.findObjectsInBackgroundWithBlock  
        (objects, error) -> Void in

        if let users = objects 
            for object in users  
                self.photoData.addObject(object)
                print("Fetched \(self.dogSelectedName)'s \(self.photoData.count) Images") 
             
        

        dispatch_async(dispatch_get_main_queue())  () -> Void in
            self.collectionView.reloadData()
        
    

您可以在发送数据后再次调用lookUpPhotos 函数。

saveImage.saveInBackgroundWithBlock  (Bool, error) -> Void in
    if error != nil 
        print("There was an error")
     else 
        print("New Gallery object saved: \(saveImage)")
        dispatch_async(dispatch_get_main_queue())  () -> Void in
            self.dismissViewControllerAnimated(true)  () -> Void in
                self.lookUpPhotos()
            
        
    

【讨论】:

因为我们在讨论这个主题,所以我在另一个 viewController 上遇到了同样的问题,一旦从上一个视图中选择,它就会全屏显示图像。相反,当我删除照片和对象时,我呈现ViewController(galleryVC, animated: true, completion: nil) 并且它没有及时更新lookUpPhotos() 方法,因此我刚刚删除的图像仍然存在。但是当我离开并回来时它就消失了。我无法从以前的 viewController 中提取我的 lookUpPhotos() 方法,因为我正在使用新方法。有什么建议吗?在 deleteInBackgroundWithBlock 块中添加更多代码?【参考方案2】:

您已将其保存在 Parse 中,但您似乎并未将其添加到数据源中。

所以如果你的UICollectionViewDogs或DogImages的数据源是一个数组,叫做

var dogArray = []

您需要将您的狗添加到 didFinishPickingImage 中的该数组中

dogArray.append(imagePicture)

希望对你有帮助

【讨论】:

他说他的UICollectionView 是从 Parse 填充的,因此他实际上应该调用最初调用的函数以在将图像发送到 Parse 后加载图像。 UICollectionViews 使用数据源。您不能只“从 Parse 填充” 显然。他正在将 Parse 中的数据放入数据源。处理来自服务器的数据时,最好不要让它们不同步。即使他将数据发送到 Parse,他仍应将数据重新加载回数据源,以确保数据被正确存储。否则,他只是在本地盲目更新。 不,您正在添加一个额外的 API 请求。 saveInBackgroundWithBlock 以布尔值响应,告诉您保存是否成功。如果成功,请将其添加到您的 dataSource@Caleb 此外,在保存数据之前添加数据是一种相当常见的 UX 策略,以使应用程序感觉比实际速度更快。

以上是关于UIImagePickerController 关闭后 UICollectionView 不会 reloadData()的主要内容,如果未能解决你的问题,请参考以下文章

UIImagePickerController、自定义 UIButton 和 AutoLayout

UIImagePickerController 实况照片

OCMock 模拟 UIImagePickerController

UIImagePickerController 图像没有改变

无法弹出 UIImagePickerController

为啥 UIImagePickerController 不能推入导航栈?