如何将集合视图上选择的所有单元格列出到另一个视图中

Posted

技术标签:

【中文标题】如何将集合视图上选择的所有单元格列出到另一个视图中【英文标题】:How to list all cells selected on a collection view's into another view 【发布时间】:2016-11-16 12:31:26 【问题描述】:

我正在使用拆分视图组件开发场景。在我的主视图中,我在容器内有一个表格视图,在我的详细视图中,我在容器内有一个集合视图。

我正在尝试在“详细视图的集合视图容器”中选择所有单元格并在“主视图表视图”中列出,但我不知道如何从这些信息中获取访问权限。在详细视图中,我知道我可以使用“collectionView.indexPathsForSelectedItems()”选择单元格,但是如何在每次详细选择单元格时在视图外部访问此信息并在主视图表上创建一个新的表格单元格查看集合视图?

编辑:

我正在阅读有关委派的内容,我编写了这些代码来尝试通过视图共享数据,但它不起作用:

1) 我写了这个委托协议:

protocol MasterDetailShareDataDelegate: class 
  func reloadMasterViewWithSelectedCells(_ data: Set<String>)
 

2) 我将委托变量放在原始视图上:

class ProductsPlatesViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate 
  var platesSelected: Set<String> = Set()
  var delegate: MasterDetailShareDataDelegate?

  ...

  func passDataBackWards() 
    let data = platesSelected
    delegate?.reloadMasterViewWithSelectedCells(data)
  

  func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
    var cell = collectionView.cellForItem(at: indexPath) as! ProductsPlatesCollectionViewCell
    cell.backgroundColor = UIColor.green

    platesSelected = Set()

    for item in collectionView.indexPathsForSelectedItems!  
      platesSelected.insert(self.plates[item.row])
    
    passDataBackWards()
  

  func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) 
    var cell = collectionView.cellForItem(at: indexPath) as! ProductsPlatesCollectionViewCell
    cell.backgroundColor = UIColor.clear

    platesSelected = Set()

    for item in collectionView.indexPathsForSelectedItems!  
      platesSelected.insert(self.plates[item.row])
    
    passDataBackWards()
  

3)在命运视图上写了这段代码:

class NewBudgetViewController: UIViewController, MasterDetailShareDataDelegate 

  override func viewDidLoad() 
    super.viewDidLoad()

    let theProductsPlatesViewController = ProductsPlatesViewController()
    theProductsPlatesViewController.delegate = self
    ...
  


  func reloadMasterViewWithSelectedCells(_ data: Set<String>) 
    print(data)
  

NewBudgetViewController 中的函数 reloadMasterViewWithSelectedCells 未被调用。有人可以告诉我为什么吗? :(

【问题讨论】:

将所有选定单元格的数据带到另一个视图并在那里创建相同的单元格。 是的。这正是我想做的。但是怎么做?如何从另一个视图实时访问信息(我的意思是,当用户从一个视图单击单元格时,另一个视图知道它并创建相同的单元格)? 你想要目标 C 还是 swift ? Swift 优先。 怎么样!只需将所有选定的数据保存在一个数组中,然后将该数组传递给下一个类的数组(使其成为一个属性)。然后将该数组用作下一个类的数据源。 【参考方案1】:

这是委托设计模式的一个很好的例子。设计一个协议,让集合视图控制器通知它的委托关于选择了哪些单元格。使主视图控制器成为集合视图控制器的委托。

编辑:

尝试在 Google 上搜索“Swift 委托模式”或“Swift 委托教程”。我在网上找到了这个看起来不错的解释:

http://useyourloaf.com/blog/quick-guide-to-swift-delegates/

编辑#2:

好的,我看到您使用的是主/细节设计。在这种情况下,您的主视图控制器应该有一个 prepareForSegue 方法(在 Swift 3 中为 prepare(for:sender:))。在该方法中,您应该能够访问目标视图控制器并设置它的委托属性。

如果您没有prepare(for:sender:) 方法,请添加一个。

从 Xcode 8 的主/详细模板项目中的代码开始:

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "showDetail" 
        if let indexPath = self.tableView.indexPathForSelectedRow 
            if let theProductsPlatesViewController = (segue.destination as!
                    UINavigationController).topViewController 
                    as? ProductsPlatesViewController 
                theProductsPlatesViewController.delegate = self
                //Other setup for your detail view controller
            
        
    
  

【讨论】:

你好邓肯。感谢您的回答。我可以理解你描述的概念,但我从来不需要实现自己的协议。您能否在此处提供与此案例相关的一些代码示例或网络上的一些示例?我有点开始使用 ios-dev,不知道如何在代码上实现这个委托:( 再次感谢。我阅读了您在更新中发布的文本,我正在尝试使用委托来实现这一点,但仍然无法正常工作。我还编辑了描述我编写的代码的帖子。请看一下。我做的一切对吗? :X 看来您的方向是正确的。现在你需要调试你的代码。乍一看,我看不到您在哪里设置 ProductsPlatesViewController 的委托属性。 (可以在NewBudgetViewController 中创建并显示ProductsPlatesViewController。它看起来类似于theProductsPlatesViewController.delegate = self。) 我在 NewBudgetViewContoller viewDidLoad() 方法中添加了这两行:let theProductsPlatesViewController = ProductsPlatesViewController() theProductsPlatesViewController.delegate = self 但是没有调用 NewBudgetViewController 上的方法(打印数据)。我做错了什么?我看不出有什么修改可以使这项工作:( 编辑您的问题以显示您如何创建ProductsPlatesViewController、对其进行配置和显示。我的猜测是,您刚刚发布的代码正在创建一个完全独立的 ProductsPlatesViewController 实例,它永远不会显示在任何地方。

以上是关于如何将集合视图上选择的所有单元格列出到另一个视图中的主要内容,如果未能解决你的问题,请参考以下文章

将集合视图中的单元格移动到另一部分的最后一个单元格之外不起作用

在 Actionsheet 上选择的 NSDictionary,来自带有自定义单元格的 UITableView

如何将数据从一个单元格传递到另一个视图?

如何将集合视图单元格设置为所有屏幕的相等行单元格

Swift 4:将数据从集合视图单元传递到另一个没有故事板的视图控制器

集合视图不会每次都重新加载