Swift:“收藏夹视图”单元中用于UIControl的tvOS IBAction永远不会被调用

时间:2019-07-06 09:22:45

标签: swift uicollectionview uibutton uicollectionviewcell tvos

我知道这个问题已经被问过很多次了,但是我仍在学习,我在S.O中尝试了所有可能的解决方案。而且我还没有碰到一次运气。这就是问题所在:

  • 我正在使用Xcode 11 beta 3(希望这不是问题!)
  • 我在视图控制器中有一个简单的集合视图
  • 我在单元格内部放置了一个tvOS'TVPosterView-它继承自UIControl并对其进行测试,它的行为就像一个按钮(调用了IBAction)。
  • 在收藏夹视图中,当我按下海报时会显示动画
  • 海报视图具有默认图像,我只是更改标题
  • 我将IBAction从发布者视图拖到IB中的单元格类中
  • 除了IBAction外,收藏夹视图还可以很好地显示和滚动,从而更改了海报的标题
  • 如果我将集合视图委托给视图控制器,则会调用 collectionView(_ collectionView:UICollectionView,didSelectItemAt indexPath:IndexPath)

代码如下:

视图控制器

import UIKit
import TVUIKit

class SecondViewController: UIViewController {

    @IBOutlet weak var myView: UIView!
    @IBOutlet weak var myCollection: MyCollection!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
}

extension SecondViewController: UICollectionViewDataSource {

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

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

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell", for: indexPath) as! MyCell

        cell.myPoster.title! = "Header " + String(indexPath.row + 1)

        cell.myPoster.tag = indexPath.row + 1
        cell.posterTapAction = { cell in
            print("Header is: \(cell.myPoster.title!)")
        }

        return cell
    }
}

extension SecondViewController: UICollectionViewDelegate {

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// This one works - but that's not what I am looking for
        print("From didSelectItemAt indexPath: \(indexPath.item + 1)")
    }
}

收藏夹视图

import UIKit

class MyCollection: UICollectionView {

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func layoutSubviews() {
        super.layoutSubviews()
    }
}

单元格

import UIKit
import TVUIKit

class MyCell: UICollectionViewCell {

    var posterTapAction: ((MyCell) -> Void)?

    @IBOutlet weak var myPoster: TVPosterView!
    @IBAction func myAction(_ sender: TVPosterView) {
        posterTapAction?(self)
        print("Poster pressed \(sender.tag)")
    }
}

关于我所缺少的任何想法吗?我很乐意在按下海报后设法打印出虚拟字符串。

我还尝试了使用选择器和委托的解决方案,但均无效果。因此,请让我们用closures专注于这个特定的解决方案。谢谢!

1 个答案:

答案 0 :(得分:1)

我终于找到了。像往常一样,这是由于tvOS的关注。基本上,单元必须不可聚焦,以便单元内的UIControl元素(在我的情况下为TVPosterView,但可以是任何UIControl)将成为聚焦的元素。之所以令人迷惑,是因为它在图形上确实看起来像海报具有焦点(可以将海报旋转一点)。

解决方案是将collectionView(_:canFocusItemAt:)添加到 UICollectionViewDelegate

pcm.!default {
  type asym
  capture.pcm "mic"
  playback.pcm "speaker"
}
pcm.mic {
  type plug
  slave {
    pcm "hw:1,0"
  }
}
pcm.speaker {
  type plug
  slave {
    pcm "hw:0,0"
    rate 16000
  }
}

我已经在此问题的代码中对其进行了测试,并将其添加到我的项目中,该项目终于可以使用!