我在UITableViewCell
中嵌入了一个UICollectionView
,我想在按下UICollectionViewCell
时执行一个segue,并将该单元格表示的数据传递给目标ViewController
以获取详细信息。
以下是UITableViewCell
内嵌入UICollectionView
的代码
@IBOutlet weak var EventCollection: UICollectionView!
var events = [Events]()
override func awakeFromNib() {
super.awakeFromNib()
EventCollection.delegate = self
EventCollection.dataSource = self
}
extension PopularCell: UICollectionViewDelegate, UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return events.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = EventCollection.dequeueReusableCell(withReuseIdentifier: "EventCell", for: indexPath) as! EventCell
let event = events[indexPath.row]
print("Event Name:(event.event_name)")
cell.event = event
cell.tag = indexPath.row
return cell
}
当按下UICollectionViewCell
时,我如何在主ViewController
中执行和准备一个 segue,以便将该单元格包含的数据传递到目标ViewController
以下是您需要执行的步骤。
-
正如你所说,你的收藏视图在
TableView
里面。因此,您的 TableView 委托/数据源与 MainViewController 绑定。CollectionView
与TableViewCell
绑定的委托/数据源。 -
现在创建一个协议以了解用户已单击
collectionView
。protocol MyProtocol : class { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) }
-
在
TableViewCell
中,你需要像这样调用委托,class MyTableCell : UITableViewCell, UICollectionViewDelegate { weak var delegate : MyProtocol? : : func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { if let delegate = delegate { delegate.collectionView(collectionView, didSelectItemAt: indexPath) } } }
-
现在,您的
MainViewController
必须符合此协议,class MainViewController :UIViewController, MyProtocol { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { // Do segue here .... } }
注意:确保将委托与您的MainViewController
绑定,即TableviewCellForRow
有cell.delegate = self
-
在名为 UIView_Ext 的新文件中添加以下代码
extension UIView { var parentViewController: UIViewController? { var parentResponder: UIResponder? = self while parentResponder != nil { parentResponder = parentResponder!.next if let viewController = parentResponder as? UIViewController { return viewController } } return nil } }
-
在
func didSelectItem(At indexPath: IndexPath)
方法中,编写以下代码self.parentViewController?.performSegue(withIdentifier: "Identifer", sender: "Your Data in place of this string")