从collectionView中的自定义tableView以编程方式进行查看

时间:2016-11-05 08:44:21

标签: ios swift uitableview uicollectionview segue

我有两个班级:

class FeedAndGroupsViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {}

class eventsCustomCollectionCell: UICollectionViewCell, UITableViewDataSource, UITableViewDelegate {}

... collectionView类创建UITableView。

我正在尝试在单击tableViewCell时创建自定义segue。我已经为tableView实现了tableView(didSelectRowAt)函数,它工作正常。但是,我无法从此函数调用performSegue。有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

这是因为您的类eventsCustomCollectionCell是UICollectionViewCell子类而不是UIViewController子类。

func performSegue(withIdentifier identifier: String, sender: Any?)

是UIViewController中可用的方法。因此,对于解决方案,您可以在eventsCustomCollectionCell中创建一个可以有方法

的协议
func cellClicked(cell: eventsCustomCollectionCell)

并且您的FeedAndGroupsViewController可以实现此协议并可以调用performSegue。

我已经为您的用例编写了框架代码,您可以参考此代码并开始使用。

class EventsCustomCollectionCell: UICollectionViewCell,UITableViewDelegate{
    weak var delegate : EventsCustomCollectionCellDelegate?
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        delegate?.didClick(cell: self)
    }
}

protocol EventsCustomCollectionCellDelegate : class{
    func didClick(cell:EventsCustomCollectionCell)
}

class FeedAndGroupsViewController: UIViewController,EventsCustomCollectionCellDelegate,UICollectionViewDataSource{
var collectionView : UICollectionView!
var yourArrayForCollectionView = [String]()

func didClick(cell:EventsCustomCollectionCell){
    if let index = collectionView.indexPath(for:cell){
        let object = yourArrayForCollectionView[index.row]
        performSegue(withIdentifier: "Your segue identifier", sender: object)
    }
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Your cell reuse id", for: indexPath) as! EventsCustomCollectionCell
    cell.delegate = self
    return cell
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int{
    return yourArrayForCollectionView.count
}
}

希望这有帮助。

答案 1 :(得分:0)

这让我旋转了一段时间。在我的例子中,我有一个UITableViewCell,里面有一个UICollectionView。表视图单元格正在保存项目数组。我无法访问ViewController中指定索引的那些项目。此外,不使用故事板,而不是performSegue(withIdentifier: "Your segue identifier", sender: object)我使用self.navigationController?.pushViewController(detailVC, animated: true)

这是最终为我工作的东西。我必须在协议函数中实际传递对象。

protocol NearbyTableViewCellDelegate : class{
    func didClick(cell: EatsItemNearbyTableCell, eat: Eats)
}


 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let eat = nearByEats[indexPath.row]
        delegate?.didClick(cell: self, eat: eat)
    }

在ViewController中:

extension EatsItemDetailVC: NearbyTableViewCellDelegate {
    func didClick(cell: EatsItemNearbyTableCell, eat: Eats) {
        let detailVC = EatsItemDetailVC()
        detailVC.eat = eat
        detailVC.currentLocation = currentLocation
        self.navigationController?.pushViewController(detailVC, animated: true)
    }
}