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 中,但您似乎并未将其添加到数据源中。
所以如果你的UICollectionView
的Dog
s或DogImage
s的数据源是一个数组,叫做
var dogArray = []
您需要将您的狗添加到 didFinishPickingImage
中的该数组中
dogArray.append(imagePicture)
希望对你有帮助
【讨论】:
他说他的UICollectionView
是从 Parse 填充的,因此他实际上应该调用最初调用的函数以在将图像发送到 Parse 后加载图像。
UICollectionView
s 使用数据源。您不能只“从 Parse 填充”
显然。他正在将 Parse 中的数据放入数据源。处理来自服务器的数据时,最好不要让它们不同步。即使他将数据发送到 Parse,他仍应将数据重新加载回数据源,以确保数据被正确存储。否则,他只是在本地盲目更新。
不,您正在添加一个额外的 API 请求。 saveInBackgroundWithBlock
以布尔值响应,告诉您保存是否成功。如果成功,请将其添加到您的 dataSource@Caleb
此外,在保存数据之前添加数据是一种相当常见的 UX 策略,以使应用程序感觉比实际速度更快。以上是关于UIImagePickerController 关闭后 UICollectionView 不会 reloadData()的主要内容,如果未能解决你的问题,请参考以下文章
UIImagePickerController、自定义 UIButton 和 AutoLayout
OCMock 模拟 UIImagePickerController