如何在另一个 UIViewController 中编辑 UICollectionView 项目?
How to edit a UICollectionView item in another UIViewController?
我在 Swift 中使用主从视图控制器。
当我单击主单元格时,我会看到一个包含图片列表的 collection 视图。
每张图片代表存储在 Core Data 中的数据。
每张图片数据也有一个时间戳,同一天拍摄的所有照片都存储在同一个主单元格中。
[Date of the day 1]
[pic1]
[pic2]
[Date of the day 2]
[pic3]
[pic4]
我想实现的是:
当我点击一张图片时,会显示另一个 ViewController(通过 segue),这个新的 VC 允许我编辑图片并更改它的日期。
问题是,当我更改日期或图片时,这里发生了很多事情:
- 如果图片在 collection 中是单独的,那么我也必须删除 Master Day 单元格。
- 如果图片不是单独的,我只需要更新细节collection视图
- 在任何情况下,如果我必须创建一个新的 Day,我需要创建一个新的 Master Cell 并更新视图,如果我需要删除一个 Day,我还必须更新 Master 视图。
如果您编辑 collection 项,您只需执行以下操作:
self.collectionView performBatchUpdates:
然后更新模型,并将您的操作通知 collection 视图...
但我不知道如何从另一个 UIViewController.
做到这一点
目前,我在编辑视图控制器中更新了模型,然后关闭了视图控制器。我崩溃了,因为 collectionView 试图显示一个不再属于当前 collection 的项目...
为了解决这个问题,也许我可以使用一个协议来从编辑视图通知详细视图,但如果我这样做,我需要将编辑单元格的索引路径提供给编辑视图,然后再提供它通过协议回到详细视图......为什么不呢。但在我看来不是那么干净。
另一个问题是,当我删除一天时,应用程序在主视图中似乎也崩溃了。因为,主视图不知道我从编辑视图中删除了一天。
我的主要问题是我不知道如何告诉我的主视图控制器我做了一些模型更改...尤其是当我在编辑视图中没有任何 IndexPath 信息时。
从技术上讲,我可以使用 notificationCenter 通知两个视图,我猜...但是,我仍然需要将两个 IndexPath 从主视图传递到详细视图,然后再传递到编辑视图。
丑。
实现这一目标的几种方法:
1) 委托:包含集合视图的视图控制器将充当编辑视图控制器的委托,当编辑完成时它将回调一个方法给'The view controller containing collection view'
2) 通知:编辑完成
3)块
使用协议是一个很好的解决方案,但可能会很痛苦,因为您必须使用它们的 indexPaths 来管理已编辑的项目。一个更简单的解决方案,因为您使用的是 CoreData,所以使用计算的 属性 获取条目,然后从包含 collectionView 的控制器中调用 viewWillAppear
方法上的 collectionView.reloadData()
。这种调用重新加载数据的方式将重新计算核心数据条目并将每个项目放置在正确的位置。 viewWillAppear 也会在关闭位于集合视图控制器顶部的控制器后被调用
我发现一篇有趣的文章解决了我的问题。
这确实不是一个小问题...
http://www.objc.io/issues/4-core-data/full-core-data-application/#using-a-collection-view
我在 Swift 中使用主从视图控制器。 当我单击主单元格时,我会看到一个包含图片列表的 collection 视图。 每张图片代表存储在 Core Data 中的数据。 每张图片数据也有一个时间戳,同一天拍摄的所有照片都存储在同一个主单元格中。
[Date of the day 1]
[pic1]
[pic2]
[Date of the day 2]
[pic3]
[pic4]
我想实现的是: 当我点击一张图片时,会显示另一个 ViewController(通过 segue),这个新的 VC 允许我编辑图片并更改它的日期。
问题是,当我更改日期或图片时,这里发生了很多事情:
- 如果图片在 collection 中是单独的,那么我也必须删除 Master Day 单元格。
- 如果图片不是单独的,我只需要更新细节collection视图
- 在任何情况下,如果我必须创建一个新的 Day,我需要创建一个新的 Master Cell 并更新视图,如果我需要删除一个 Day,我还必须更新 Master 视图。
如果您编辑 collection 项,您只需执行以下操作:
self.collectionView performBatchUpdates:
然后更新模型,并将您的操作通知 collection 视图... 但我不知道如何从另一个 UIViewController.
做到这一点目前,我在编辑视图控制器中更新了模型,然后关闭了视图控制器。我崩溃了,因为 collectionView 试图显示一个不再属于当前 collection 的项目...
为了解决这个问题,也许我可以使用一个协议来从编辑视图通知详细视图,但如果我这样做,我需要将编辑单元格的索引路径提供给编辑视图,然后再提供它通过协议回到详细视图......为什么不呢。但在我看来不是那么干净。
另一个问题是,当我删除一天时,应用程序在主视图中似乎也崩溃了。因为,主视图不知道我从编辑视图中删除了一天。
我的主要问题是我不知道如何告诉我的主视图控制器我做了一些模型更改...尤其是当我在编辑视图中没有任何 IndexPath 信息时。
从技术上讲,我可以使用 notificationCenter 通知两个视图,我猜...但是,我仍然需要将两个 IndexPath 从主视图传递到详细视图,然后再传递到编辑视图。
丑。
实现这一目标的几种方法:
1) 委托:包含集合视图的视图控制器将充当编辑视图控制器的委托,当编辑完成时它将回调一个方法给'The view controller containing collection view'
2) 通知:编辑完成
3)块
使用协议是一个很好的解决方案,但可能会很痛苦,因为您必须使用它们的 indexPaths 来管理已编辑的项目。一个更简单的解决方案,因为您使用的是 CoreData,所以使用计算的 属性 获取条目,然后从包含 collectionView 的控制器中调用 viewWillAppear
方法上的 collectionView.reloadData()
。这种调用重新加载数据的方式将重新计算核心数据条目并将每个项目放置在正确的位置。 viewWillAppear 也会在关闭位于集合视图控制器顶部的控制器后被调用
我发现一篇有趣的文章解决了我的问题。 这确实不是一个小问题...
http://www.objc.io/issues/4-core-data/full-core-data-application/#using-a-collection-view