我已使用this tutorial成功将UICollectionView
嵌入到我的ViewController中的UITableView
内。
如果你快速浏览一下链接教程的代码(以及一个非常好的东西也可以学习它),以下内容可能会更有意义。:
我的下一步是从tableView的UICollectionView
内的UITableViewCell
单元格中执行segue,但由于collectionView出口是在单独的View Controller中建立的,我不是确定如何在主ViewController中引用它。
在TableViewCell.swift中有:
class TableViewCell: UITableViewCell {
@IBOutlet private weak var collectionView: UICollectionView!
}
extension TableViewCell {
func setCollectionViewDataSourceDelegate<D: protocol<UICollectionViewDataSource, UICollectionViewDelegate>>(dataSourceDelegate: D, forRow row: Int) {
collectionView.delegate = dataSourceDelegate
collectionView.dataSource = dataSourceDelegate
collectionView.tag = row
collectionView.reloadData()
}
}
在ViewController.swift中,我需要能够,例如,调用ViewController.swift中prepareForSegue
函数中TableViewCell中的 collectionView 。文件。我只需要用collectionView插座填补空白:
let destination = segue.destinationViewController as! SecondViewController
let indexPaths = self.___________.indexPathsForSelectedItems()
let indexPath = indexPaths![0] as NSIndexPath
let arrayObject = self.arrayObjects[indexPath.row]
destination.object = arrayObject
'object'在SecondViewController中实现,如var object: PFObject!
。
我现在需要在上面的代码中用collectionView填补空白________,以便在SecondViewController(destinationViewController)中显示正确的“对象”
答案 0 :(得分:5)
这是:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "YourSegueIdentifier" {
if let collectionCell: YourCollectionViewCell = sender as? YourCollectionViewCell {
if let collectionView: UICollectionView = collectionCell.superview as? UICollectionView {
if let destination = segue.destination as? YourViewController {
// Pass some data to YourViewController
// collectionView.tag will give your selected tableView index
destination.someObject = tableObjects[collectionView.tag].someObject
destination.productId = collectionCell.product?.id
}
}
}
}
}
答案 1 :(得分:2)
您好我有同样的问题
这就是我所做的:
<强> 1。在第一个视图控制器的扩展名中为单元格设置标记
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
{
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("advertisementCollectionCell",forIndexPath: indexPath) as! AdvertisementCollectionViewCell
// set your cell information
cell.tag = indexPath.row
return cell
}
<强> 2。在故事板上从UIcollectionViewCell到新的视图控制器
执行segue 第3。在第一个TableViewController的 prepareForSegue
中:
else if segue.identifier == "identifier"
{
let destinationViewController = segue.destinationViewController as! DestinationViewController
if let cell = sender as? MyCollectionViewCell
{
let indexPath = cell.tag
// use indexPath :D
}
}
答案 2 :(得分:0)
我刚玩了你附上的代码。我手动在故事板中添加了segue。它很容易打电话。
1)只需将viewcontroller添加到故事板。
2)Controll +拖放来自collectionview
单元格的segue
答案 3 :(得分:0)
在您的代码中,对CollectionView的引用在TableViewCell中连接
因此,您可以通过TableViewCell引用它并设置数据源和委托
要在代码中添加connect,必须选择带有RightButton的CollectionView并拖放到@IBOutlet private weak var collectionView:UICollectionView!
单击CollectionViewCell时,委托将调用UICollectionViewDelegate的collectionView(collectionView:UICollectionView,didselecteditemAtIndexPath indexPath:NSIndexPath)函数。
那时,你可以通过在这个函数中调用performSegue来实现
当您在代码中编写时,tableview的索引由标记设置,因此您可以使用collectionView.tag()逐个标记获取索引。
代码如下
var tableViewIndex = collectionView.tag()
因此,您可以使用tableViewIndex和indexPath引用正确的单元格。
<!DOCTYPE html>
<html>
<head>
<title>Angular 2 QuickStart</title>
<!-- bootstrap -->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
<!-- 1. Load libraries -->
<script src="https://rawgithub.com/systemjs/systemjs/0.19.6/dist/system.js"></script>
<script src="https://code.angularjs.org/tools/typescript.js"></script>
<script src="https://code.angularjs.org/2.0.0-beta.0/angular2-polyfills.js"></script>
<script src="https://code.angularjs.org/2.0.0-beta.0/Rx.js"></script>
<script src="https://code.angularjs.org/2.0.0-beta.0/http.dev.js"></script>
<script src="https://code.angularjs.org/2.0.0-beta.0/angular2.dev.js"></script>
<!-- 2. Configure SystemJS -->
<script>
System.config({
transpiler: 'typescript',
typescriptOptions: {emitDecoratorMetadata: true},
packages: {'app': {defaultExtension: 'ts'}}
});
System.import('app/boot')
.then(null, console.error.bind(console));
</script>
</head>
<!-- 3. Display the application -->
<body>
<my-app>Loading...</my-app>
</body>
</html>