मैं 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 में डालने का प्रयास किया लेकिन यह काम नहीं कर रहा है। किसी भी सुझाव के लिए बहुत आभार होगा।

अद्यतन

मैंने निम्नलिखित सूत्र से सुझाव की कोशिश की: RxSwift में CollectionView सेल का चयन कैसे करें

और subscribe विधि से पहले .debug("RX: Model selected") जोड़ा। मैं कंसोल में आउटपुट देखता हूं कि इसे एक बार सब्सक्राइब किया गया है।

अद्यतन

मैंने 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
Nikita Vlasenko 16 अप्रैल 2018, 21:17

1 उत्तर

सबसे बढ़िया उत्तर

आप UIGestureRecognizerDelegate प्रोटोकॉल के साथ टैप कर सकते हैं और विधि को लागू कर सकते हैं func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool

मूल रूप से, जब भी आप किसी UICollectionViewCell को स्पर्श करते हैं, तो आपको false वापस लौटना होगा, यदि मैं समस्या को सही ढंग से समझता हूं।

आप UICollectionView से func indexPathForItem(at point: CGPoint) -> IndexPath? विधि का उपयोग करके ऐसा कर सकते हैं। यदि दिया गया CGPoint किसी सेल के स्थान से मेल खाता है, तो आपको उसका IndexPath मिलेगा।

टच लोकेशन को कलेक्शन व्यू के फ्रेम में ट्रांसलेट करना न भूलें - इसके लिए आप यूआईटच के 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
}
5
Matheus Boeira 24 अप्रैल 2018, 02:44