我有一个tableview单元格,我在其中添加了collectionview单元格(用于水平滚动)。
现在我想在按水平集合视图的任何单元格时推送到其他导航控制器。怎么做 ?或者我如何定义细胞印刷的委托方法。
代码:
ViewController.swift:
class ViewController: UIViewController {
var categories = ["Action", "Drama", "Science Fiction", "Kids", "Horror"]
}
extension ViewController : UITableViewDelegate { }
extension ViewController : UITableViewDataSource {
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return categories[section]
}
func numberOfSections(in tableView: UITableView) -> Int {
return categories.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CategoryRow
return cell
}
}
CategoryRow.swift
class CategoryRow : UITableViewCell {
@IBOutlet weak var collectionView: UICollectionView!
}
extension CategoryRow : UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 12
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "videoCell", for: indexPath) as! VideoCell
return cell
}
}
extension CategoryRow : UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let itemsPerRow:CGFloat = 4
let hardCodedPadding:CGFloat = 5
let itemWidth = (collectionView.bounds.width / itemsPerRow) - hardCodedPadding
let itemHeight = collectionView.bounds.height - (2 * hardCodedPadding)
return CGSize(width: itemWidth, height: itemHeight)
}
}
VideoCell.swift
class VideoCell : UICollectionViewCell {
@IBOutlet weak var imageView: UIImageView!
}
答案 0 :(得分:3)
在这里,您将在didSelectItemAtIndexPath
课程的代理方法CategoryRow
上点击该单元格,然后您可以从那里开始委托以在ViewController
内拨打电话
ViewController.swift :
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CategoryRow
cell.delegate = self
return cell
}
VideoCell.swift :
protocol CategoryRowDelegate:class {
func cellTapped()
}
CategoryRow.swift :
class CategoryRow : UITableViewCell {
weak var delegate:CategoryRowDelegate?
@IBOutlet weak var collectionView: UICollectionView!
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if delegate!= nil {
delegate?.cellTapped()
}
}
在ViewController
func cellTapped(){
//code for navigation
}
答案 1 :(得分:1)
我认为在这种情况下使用通知会更好。
在集合视图didSelectItem
中发布通知
NSNotificationCenter.defaultCenter().postNotificationName(notificationIdentifier, object: nil)
并在viewController viewDidLoad
中添加一个观察者,如下所示
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(pushToNew(_:)), name: notificationIdentifier, object: nil)
在新的pushToNew
函数中,执行你的segue
func pushToNew(notification: Notification) {
// perform your segue here. Navigate to next view controller
}
答案 2 :(得分:1)
首先从 CategoryRow.swift 创建委托协议,如下面的代码
protocol CollectionViewSelectionDelegate: class {
func didSelectedCollectionViewItem(selectedObject: AnyObject)
}
现在在 VideoCell.swift 上创建委托对象,如下所示
weak var delegate:CollectionViewSelectionDelegate?
在返回单元格
之前更改 ViewController.swift 代码cell?.delegate = self
在ViewController.swift中覆盖委托方法,并从UICollectionView Delegate方法调用VideoCell.swift中的类似方法。
答案 3 :(得分:-1)
制定协议
protocol collectionViewCellClicked{
func cellClicked()
}
在主视图控制器中实现此协议您的视图控制器如下所示
class ViewController: UITableViewController, collectionViewCellClicked{ func cellClicked(){ // Your Code }}
您的cellForRowAt委托看起来像这样
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: <#T##String#>, for: <#T##IndexPath#>)
cell.delegate = self
return cell
}
在表格视图单元格中创建类型为collectionViewCellClicked 的变量
var delegate: collectionViewCellClicked?
和您的didSelectItemAt委托
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
delegate.cellClicked()
}