Ios 如何在另一个UIViewController中编辑UICollectionView项?

Ios 如何在另一个UIViewController中编辑UICollectionView项?,ios,swift,uicollectionview,edit,master-detail,Ios,Swift,Uicollectionview,Edit,Master Detail,我正在使用Swift的主细节视图控制器。 单击主单元格时,我会看到一个包含图片列表的集合视图。 每张图片表示存储在岩芯数据中的数据。 每个图片数据还具有时间戳,并且当天拍摄的所有图片都存储在同一主单元中 [Date of the day 1] [pic1] [pic2] [Date of the day 2] [pic3] [pic4] 我想要实现的是: 当我点击图片时,会显示另一个ViewController(通过segue),这个新的VC允许我编辑图片并更改其日期

我正在使用Swift的主细节视图控制器。 单击主单元格时,我会看到一个包含图片列表的集合视图。 每张图片表示存储在岩芯数据中的数据。 每个图片数据还具有时间戳,并且当天拍摄的所有图片都存储在同一主单元中

[Date of the day 1]
   [pic1]
   [pic2]

[Date of the day 2]
   [pic3]
   [pic4]
我想要实现的是: 当我点击图片时,会显示另一个ViewController(通过segue),这个新的VC允许我编辑图片并更改其日期

问题是,当我改变一天或一张照片时,这里发生了多种事情:

  • 如果这张照片是收藏中唯一的一张,那么我也必须删除主日单元格
  • 如果不是只有这张照片,我只需要更新细节集合视图
  • 在任何情况下,如果我必须创建一个新的日期,我需要创建一个新的主单元格并更新视图,如果我需要删除一天,我还必须更新主视图
如果编辑集合项,只需执行以下操作:

self.collectionView performBatchUpdates:
然后更新模型,并将您的操作通知集合视图。。。 但我不知道如何从另一个UIViewController中做到这一点

当前,在“编辑视图控制器”中,我更新模型,然后关闭视图控制器。我遇到了一个崩溃,因为collectionView试图显示一个不再属于当前集合的项目

为了解决这个问题,也许我可以使用协议从编辑视图通知细节视图,但如果我这样做,我需要将编辑单元格的IndexPath提供给编辑视图,然后通过协议将其返回给细节视图。。。为什么不呢?但在我看来没有那么干净

另一个问题是,当我删除一天时,应用程序似乎也会在主视图中崩溃。因为,主视图不知道我从编辑视图中删除了一天

我的主要问题是我不知道如何告诉我的主视图控制器我做了一些模型更改。。。尤其是当我在编辑视图中没有任何IndexPath信息时

从技术上讲,我可以使用notificationCenter通知这两个视图,我想。。。但是,我仍然需要将IndexPath从主视图传递到详细视图,然后再传递到编辑视图


丑陋。

实现这一点的几种方法:

1) 委派:包含集合视图的视图控制器将充当编辑视图控制器的委派,编辑完成后,它将回调一个方法到“包含集合视图的视图控制器”

2) 通知:编辑完成


3) 块

使用协议是一个很好的解决方案,但可能会很痛苦,因为您必须使用已编辑项的索引路径来管理已编辑项。由于您使用的是CoreData,一个更简单的解决方案是使用计算属性获取条目,只需从包含collectionView的控制器中调用
collectionView.reloadData()。这种调用重载数据的方式将重新计算核心数据条目,并将每个条目放置在正确的位置。另外,在关闭位于集合视图控制器顶部的控制器后,viewWillAppear将被调用。我发现一篇有趣的文章解决了我的问题。
这确实不是一个微不足道的问题


问题是,根据文档,我需要确切说明我在主tableview和/或Detail collectionview中移动/删除了哪些内容。块与将indexPath传递给子视图(编辑)相同,但允许我编写更少的代码。我的主要问题是我应该在触摸数据之前进行自我收集查看性能更新。。据苹果公司称。调用PerformBatchUpdate来启动segue是没有意义的…如果可能的话,在git或其他地方共享代码