Nik*_*nko 0 uicollectionview swift rx-swift
我想回应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)
}
Run Code Online (Sandbox Code Playgroud)
但不知怎的onNext方法永远不会被调用.我试图把setupCellAction()在viewDidLoad,viewWillAppear并且viewDidAppear但它不工作.任何建议将不胜感激.
更新
我尝试了以下线程中的建议:如何在RxSwift中选择CollectionView单元格
并.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)
}
Run Code Online (Sandbox Code Playgroud)
它也不起作用.我也看到它在控制台中订阅了一次.
更新
UICollectionViewController嵌入在另一个容器UIViewController中,我在其中定义UITapGestureRecognizer.在注释掉代码之后UITapGestureRecognizer,该itemSelected()方法开始起作用.现在我需要一种方法让点击事件通过,如果它发生在UICollectionViewCell.有没有办法做到这一点?
在容器控制器(viewDidLoad)中点击的代码:
let tap = UITapGestureRecognizer(target: self, action:
#selector(self.handleTap(_:)))
tap.delegate = self
view.addGestureRecognizer(tap)
Run Code Online (Sandbox Code Playgroud)
该 handleTap():
@objc func handleTap(_ sender: UITapGestureRecognizer) {
tableView.isHidden = true
searchBar.resignFirstResponder()
}
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用UIGestureRecognizerDelegate协议轻松实现该方法
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool.
基本上,如果我正确理解问题,你需要false在触摸时返回UICollectionViewCell.
您可以使用func indexPathForItem(at point: CGPoint) -> IndexPath?UICollectionView中的方法执行此操作.如果给定的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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
491 次 |
| 最近记录: |