tvOS 在嵌套的 TableViewController 中执行 egue

Posted

技术标签:

【中文标题】tvOS 在嵌套的 TableViewController 中执行 egue【英文标题】:tvOS performsegue in a nested TableViewController 【发布时间】:2016-10-05 17:42:32 【问题描述】:

我在自定义 CollectionViewCell 上调用 performegue 方法时遇到问题。我的视图层次结构是 UIView-UITableView-UICollectionView。表格视图是一个静态表格视图,在我的“CustomTableViewCell”内有一个集合视图。因为我使用的是 tvOS,所以我读过我应该使用 UITapGestureRecognizer 而不是 collectionview(didSelectCell) 函数。这是我的“点击”方法,我知道它已正确连接,因为我的打印功能有效,问题是我在添加“self.performsegue”行时收到错误“CustomTableViewCell 类型的值没有成员“perfromSegue”。我试图控制 + 将一个 segue 从单元格拖动到我的下一个视图,但仍然没有。我认为它与我的“CustomTableViewCell”的类类型有关,但我不确定还要添加什么。

添加手势的项目的单元格:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "postCell", for: indexPath) as! PostCollectionViewCell

    if cell.gestureRecognizers?.count == nil 
        let tap = UITapGestureRecognizer(target: self, action: #selector(CustomTableViewCell.tapped(_:)))
        tap.allowedPressTypes = [NSNumber(value: UIPressType.select.rawValue)]
        cell.addGestureRecognizer(tap)
    

这里是敲击的方法:

func tapped(_ gesture: UITapGestureRecognizer)
    if let cell = gesture.view as? PostCollectionViewCell 
        //load next view pass movie
        guard let post = cell.post else return;
        print("\(post.title) tapped")
        self.performSegue(withIdentifier: "toPost", sender: post)
    

我试图用 cell.perfomsegue 替换 self.performsegue,因为从技术上讲,这是我在“perfromSegue(identifier:) 方法中传递信息的地方。我想的最后一件事是以某种方式调用父级CustomTableViewCell 的视图,这将是原始的 ViewController,但是当我创建 sharedController 时,我无法在 ViewController 或 ViewController.sharedController 上调用 .performsegue

【问题讨论】:

【参考方案1】:

为你的 uitableviewcell 添加一个扩展

extension UITableViewCell 
var parentViewController: UIViewController? 
    var parentResponder: UIResponder? = self
    while parentResponder != nil 
        parentResponder = parentResponder!.nextResponder()
        if let viewController = parentResponder as? UIViewController 
            return viewController
        
    
    return nil

然后在 didSelectItemAtIndexPath 中

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 
    collectionView.deselectItemAtIndexPath(indexPath, animated: true)

    if let viewController = parentViewController as? NameOfYourViewController 
        viewController.performSegueWithIdentifier("seguename", sender: nil)
    

【讨论】:

以上是关于tvOS 在嵌套的 TableViewController 中执行 egue的主要内容,如果未能解决你的问题,请参考以下文章

如何在 tvOS 中打开 GameCenter

tvOS 上的 iCloud 同步

归档 tvOS 应用

tvOS - 替换 UISlider

如何在 tvOS 上使用 Youtube API 嵌入实时流

tvOS - UIButton 在聚焦时没有动画