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

时间:2016-11-16 12:31:27

标签: ios swift uicollectionview

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

Master View Containers

Detail View containers

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

编辑:

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

1)我写了这个代表团协议:

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

2)我将委托var放在原点视图上:

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)在Destiny View上写下这段代码:

class NewBudgetViewController: UIViewController, MasterDetailShareDataDelegate {

  override func viewDidLoad() {
    super.viewDidLoad()

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


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

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

1 个答案:

答案 0 :(得分:1)

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

编辑:

尝试使用“Swift委派模式”或“Swift委派教程”进行Google搜索。我在网上发现这看起来是一个不错的解释:

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
            }
        }
    }
  }