UITableViewCell 类中的 PerfomSegue

Posted

技术标签:

【中文标题】UITableViewCell 类中的 PerfomSegue【英文标题】:PerfomSegue's in UITableViewCell Class 【发布时间】:2016-09-07 12:01:34 【问题描述】:

我有TableView 和里面的TableViewCell 我添加了UICollectionView。现在,当用户点击任何UICollectionView 时,我想将数据传递给下一个viewController,但不幸的是,我无法在我选择项目的 UITableViewCell 类中使用执行 segue。有什么办法可以在这里进行segue吗?

完整代码

class UserLibraryViewController: UIViewController 

extension UserLibraryViewController : UITableViewDelegate  

extension UserLibraryViewController : UITableViewDataSource 

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? 
    return myBooksGenre[section]


func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    return myBooksGenre.count


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return 1


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("userBooksTableViewCell") as! UserLibraryTableViewCell
    cell.tableIndexPath = indexPath

    return cell


TableViewCell

class UserLibraryTableViewCell: UITableViewCell 
@IBOutlet weak var collectionView: UICollectionView!
var tableIndexPath: NSIndexPath?



extension UserLibraryTableViewCell : UICollectionViewDataSource 

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 

    return 12


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("userBooksCollectionViewCell", forIndexPath: indexPath) as! UserLibraryCollectionViewCell



    return cell


func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 

    print("\(self.tableIndexPath!.section) ---- \(indexPath.item) \(tableSectionHeader[self.tableIndexPath!.section]) ")





extension UserLibraryTableViewCell : UICollectionViewDelegateFlowLayout 

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> 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)



【问题讨论】:

【参考方案1】:

创建一个协议,然后在TableViewCell中创建它的实例并在UserLibraryViewController中实现协议,然后在CollectionViewdidSelectItemAtIndexPath中使用该委托实例调用这样的方法。

protocol CustomCollectionDelegate 
    func selectedCollectionCell(indexPath: NSIndexPath)


class UserLibraryTableViewCell: UITableViewCell 
    @IBOutlet weak var collectionView: UICollectionView!
    var tableIndexPath: NSIndexPath?
    var delegate: CustomCollectionDelegate?
   

现在在 didSelectItemAtIndexPathCollectionView 中调用此方法。

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 

    print("\(self.tableIndexPath!.section) ---- \(indexPath.item) \(tableSectionHeader[self.tableIndexPath!.section]) ")
    self.delegate?.selectedCollectionCell(indexPath)

现在像这样在UserLibraryViewController 中实现此协议,并在cellForRowAtIndexPath 中设置委托。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("userBooksTableViewCell") as! UserLibraryTableViewCell
    cell.tableIndexPath = indexPath
    cell.delegate = self
    return cell
 

extension UserLibraryViewController : CustomCollectionDelegate 
    func selectedCollectionCell(indexPath: NSIndexPath) 
        self.performSegueWithIdentifier("Identifier", sender: indexPath)
    

注意:我添加了带有NSIndexPath作为参数的协议方法,您可以使用自定义对象或Dictionary/Array进行更改。

【讨论】:

没有醒来。分机没有被调用。尝试设置断点。 对不起,我忘了用self设置委托,检查cellForRowAtIndexPath的编辑答案。 非常感谢。它现在按照我的要求工作。 :) 嗨@NSDoc,我在传递不同的 numberOfItemsInSection 时遇到了麻烦。我通常知道如何在这里传递不同的 numberOfItemsInSection ?对于所有部分,相同的项目计数被传递而不是不同。 请添加带有新代码的新帖子,以及您创建的协议以及您遇到问题的地方。您在右表中有多个部分。那么在表格部分面临问题吗?

以上是关于UITableViewCell 类中的 PerfomSegue的主要内容,如果未能解决你的问题,请参考以下文章

点击 UITableViewCell 类中的 UIImageView 时如何打开新屏幕?

从UITableViewCell类中获取UITextView中的hashtag后尝试进行segue

自定义 uitableviewcell 中的 Uibuttons

无法在连接的自定义 UITableViewCell 类中制作插座

确定 UITableViewCell 中的 UIButton

当 UITextField 获得焦点时,从 UITableViewCell 继承类中更改 UITableViewCell 的高度