我正在尝试回复UICollectionViewCell
选择:
private func setupCellAction() {
collectionView?.rx.itemSelected
.asObservable()
.subscribe(onNext: { [weak self] indexPath in
print("itemSelected!")
let cell = self?.collectionView?.cellForItem(at: indexPath) as? CellTypeCollectionViewCell
self?.performSegue(withIdentifier: "showBarchartSegue", sender: cell)
}).disposed(by: disposeBag)
}
但是某种方式永远不会调用onNext
方法。我尝试将setupCellAction()
放入viewDidLoad
,viewWillAppear
和viewDidAppear
,但它无效。任何建议都将不胜感激。
更新
我尝试了以下主题中的建议:How to select CollectionView cell in RxSwift
并在.debug("RX: Model selected")
方法之前添加了subscribe
。我在控制台中看到它已订阅一次的输出。
更新
我尝试通过以下方式重写setupCellAction()
:
private func setupCellAction() {
collectionView?.rx.modelSelected(CellTypeCollectionViewCell.self)
.asObservable()
.debug("RX: Model selected")
.subscribe(onNext: { [weak self] cell in
print("itemSelected!")
self?.performSegue(withIdentifier: "showBarchartSegue", sender: cell)
}).disposed(by: disposeBag)
}
它也不起作用。我也看到它在控制台中订阅了一次。
更新
UICollectionViewController
已嵌入另一个容器UIViewController
中,我在其中定义了UITapGestureRecognizer
。在注释掉UITapGestureRecognizer
的代码后,itemSelected()
方法开始起作用。现在我需要一种方法让点击事件通过UICollectionViewCell
。有没有办法做到这一点?
在容器控制器(viewDidLoad
)中点击的代码:
let tap = UITapGestureRecognizer(target: self, action:
#selector(self.handleTap(_:)))
tap.delegate = self
view.addGestureRecognizer(tap)
handleTap():
@objc func handleTap(_ sender: UITapGestureRecognizer) {
tableView.isHidden = true
searchBar.resignFirstResponder()
}
答案 0 :(得分:5)
您可以使用UIGestureRecognizerDelegate协议轻松完成并实现该方法
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool
。
基本上,只要您理解了问题,就需要在触摸false
时返回UICollectionViewCell
。
您可以使用UICollectionView中的方法func indexPathForItem(at point: CGPoint) -> IndexPath?
来执行此操作。如果给定的CGPoint与单元格的位置匹配,您将获得其IndexPath。
不要忘记将触摸位置转换为集合视图的框架 - 您可以使用UITouch的func location(in view: UIView?) -> CGPoint
进行此操作。
看起来可能有点像这样:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
let point = touch.location(in: collectionView)
return collectionView.indexPathForItem(at: point) == nil
}