UICollectionReusableView विधि को नहीं बुलाया जा रहा है


79

मैं चाहता हूं कि मेरे अनुभागों में UICollectionViewछवि के साथ हेडर हो।

मैंने इन चरणों का पालन किया है:

  • स्टोरीबोर्ड पर, मेरे लिए एक सहायक के रूप में एक हेडर सौंपा UICollectionView
  • इसे एक पहचानकर्ता दिया
  • UICollectionReusableViewइसके लिए एक उपवर्ग बनाया
  • स्टोरीबोर्ड पर कस्टम वर्ग को कक्षा को सौंपा।
  • एक डाल ImageViewहैडर गौण पर
  • फ़ाइल ImageViewमें कस्टम वर्ग के लिए एक आउटलेट बनाया.h
  • निम्नलिखित को लागू किया गया viewDidLoad:

 

[self.collectionView registerClass:[ScheduleHeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerIdentifier];

-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    UICollectionReusableView *reusableview = nil;

    if (kind == UICollectionElementKindSectionHeader)
    {
        ScheduleHeaderView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerIdentifier forIndexPath:indexPath];

        headerView.headerImageView.image = [UIImage imageNamed:@"blah.png"];

        reusableview = headerView;
    }

    return reusableview;
}

मुझे पता है कि डेटा स्रोत और प्रतिनिधि विधियां काम कर रही हैं क्योंकि मैं सभी कोशिकाओं और इसके वर्गों को देख सकता हूं। हालाँकि, मेरे पास मेरे हेडर नहीं हैं। मैं ऊपर की विधि पर एक ब्रेकपॉइंट में रखता हूं और इसे कभी नहीं बुलाया जा रहा है।

मैं क्या गलत कर रहा हूं?


3
ध्यान दें कि आप kind == UICollectionElementKindSectionHeaderस्ट्रिंग सामग्री के बजाय स्ट्रिंग पॉइंटर्स की तुलना करते हैं, आप शायद [kind isEqualToString: UICollectionElementKindSectionHeader]इसके बजाय उपयोग करना चाहते हैं ।
Mac_Cain13

जवाबों:


200

ऐसा लगता है कि आपको अपने हेडर को नॉन-जीरो साइज देना होगा या collectionView:viewForSupplementaryElementOfKind:atIndexPathकॉल नहीं किया जाएगा। तो या तो headerReferenceSizeप्रवाह लेआउट की संपत्ति सेट करें:

flowLayout.headerReferenceSize = CGSizeMake(self.collectionView.frame.size.width, 100.f);

स्विफ्ट 5+

flowLayout.headerReferenceSize = CGSize(CGSize(width: self.collectionView.frame.size.width, height: 100))

या, collectionView:layout:referenceSizeForHeaderInSectionयदि आप अनुभाग द्वारा आकार भिन्न करना चाहते हैं तो कार्यान्वित करें ।


1
संग्रह दृश्य में, क्या मैं शीर्ष लेख के संदर्भ में परिभाषित करने के बजाय ऑटोलॉयआउट द्वारा गतिशील ऊंचाई के लिए कर सकता हूं?
खंत थू लिन

क्या यह स्टोरीबोर्ड में flowLayout पर शीर्ष लेख को सेट करना संभव है?
राडेक विलकैक

1
हाँ यह काम किया! layout.headerReferenceSize = CGSize (चौड़ाई: (self.collectionView? .frame. उपलब्धता) !, ऊंचाई: 50); स्विफ्ट
एंटनी ओसेफ

headerReferenceSizeकाम करता है, लेकिन मुझे अलग-अलग वर्गों के लिए अलग-अलग आकार चाहिए। और आपके द्वारा निर्दिष्ट विधि बिल्कुल भी नहीं है
व्याचेस्लाव गेर्चिकोव

33

आपने सवाल का जवाब दिया, लेकिन शब्दों में मैं बेहतर समझता हूं:

कहा जा रहा विधि बनाने के लिए, इन विधियों को जोड़ें:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {
    return CGSizeMake(60.0f, 30.0f);
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section {
    return CGSizeMake(60.0f, 30.0f);
}

... और वहाँ से चले जाओ।


31

स्विफ्ट 4 एक्सकोड 9.1 बीटा 2

@Objc जोड़ें

@objc func collectionView(_ collectionView: UICollectionView, layout  collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize{
    let size = CGSize(width: 400, height: 50)
    return size
}

क्रेडिट: https://medium.com/@zonble/your-delegation-methods-might-not-be-called-in-swift-3-c6065ed7b4cd


धन्यवाद! मेरे बट को बचाया। Btw, मैंने देखा कि यह फ़ंक्शन कलेक्शन व्यूलेगेट के लिए स्वतः-पूर्ण सूची में दिखाई नहीं देता है। मुझे पता नहीं क्यों, बहुत अजीब है। यह भी अजीब है कि हमें इसके सामने @objc टैग की आवश्यकता है।
C0D3

3
स्विफ्ट 4 में केवल @objc को फंक्शन में जोड़ने से मेरे लिए काम किया। हास्यास्पद।
लुई क्रेमेन

7
UICollectionViewDelegate के बजाय UICollectionViewDelegateFlowLayout के बजाय UICollectionViewDelegate का उपयोग करके इसे ठीक किया जाता है, यदि आप UICollectionViewFlowLayout का उपयोग कर रहे हैं।
nemissm

यदि आप अपने अनुभाग शीर्ष लेख / पाद लेख के साथ संग्रह दृश्य सीमा का उपयोग करते हैं तो यह बहुत बेहतर है: चलो आकार = CGSize (collectionView.bounds. उपलब्धता, ऊंचाई: 50)
omaestra

18

क्या आपने वर्तमान इंटरफ़ेस में UICollectionViewDelegateFlowLayout जोड़ा है? इसने मेरे लिए काम किया।

@interface MyViewController () <UICollectionViewDelegateFlowLayout>

स्विफ्ट:

class MyViewController: UICollectionViewDelegateFlowLayout {


1
आह! तो यह बात है ...UICollectionViewDelegateFlowLayout
अयान सेनगुप्ता

8

स्विफ्ट 3.0 (xcode 8.2.1)

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
    return CGSize(width:collectionView.frame.size.width, height:30.0)
}

5

स्विफ्ट संस्करण है:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
    let size = CGSize(width: 400, height: 50)
    return size
}

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {
    let size = CGSize(width: 400, height: 50)
    return size
}

XCode (संस्करण 7.3.1) स्वत: पूर्ण में इन विधियों का प्रस्ताव नहीं करता है!

यदि आप सिर्फ हेडर चाहते हैं, तो हेडर विधि को रखें।


3
    @objc (collectionView:viewForSupplementaryElementOfKind:atIndexPath:)
    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { }

उपरोक्त कोड ने मेरे लिए काम किया


2

मेरी समस्या यह थी कि स्विफ्ट 3 में, व्यूफॉर सप्लीमेंटरी एलमेंटऑफऑकंड फ़ंक्शन का नाम किसी भी पोस्ट से थोड़ा बदल गया है जो स्टैक ओवरफ्लो पर थे। इसलिए, यह कभी नहीं कहा जा रहा था। सुनिश्चित करें कि यदि आप स्विफ्ट 3 में हैं, तो आप फंक्शन मैच प्रतिनिधि हैं:

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {}

मेरा भि। मेरे लिए "IndexPath" के बजाय "at" और "NSIndexPath" के बजाय एक "_", "atIndexPath" गायब था; जैसा कि मैंने कहीं से विधि की नकल की है और आईडीई ने मुझे त्रुटि नहीं दी।
अश्क सरलाक

1

मेरे साथ भी वही दिक्कत है। मैंने जोड़ा है, referenceSizeForFooterInSectionलेकिन तब भी viewForSupplementaryElementOfKindबुलाया नहीं जा रहा है। मैंने इस कोड को जोड़ा है viewDidLoad()और इसने मेरे लिए काम किया है:

if let flowLayout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
    flowLayout.sectionFootersPinToVisibleBounds = true   
}

0

मेरे लिए, Swift 4.2 में, func collectionView (collectionView: kind: indexPath :) -> UICollectionReusableView को कभी नहीं बुलाया जा रहा था। यह एक UIViewController में संग्रह दृश्य के लिए था। मैंने देखा कि मौजूदा संग्रह दृश्य फ़ंक्शन @objc के साथ योग्य थे, और यह कि UICollectionView ने UICollectionViewDataSource और UICollectionViewDelegate प्रोटोकॉल को नहीं अपनाया था। जैसे ही मैंने प्रोटोकॉल अपनाया, मुझे त्रुटियाँ मिलीं कि संग्रह दृश्य फ़ंक्शन प्रोटोकॉल से मेल नहीं खाते। मैंने फ़ंक्शन सिंटैक्स को ठीक किया, क्वालीफायर को हटा दिया, और अनुभाग हेडर ने काम करना शुरू कर दिया।


0

यदि आपको एक सामान्य उपवर्ग मिला है, तो आपको ध्यान रखना होगा कि यदि यह अलग है तो स्विफ्ट का नाम ( https://bugs.swift.org/browse/SR-2817 ) ओबजेक प्रतिनिधि विधि नाम निर्दिष्ट करें

@objc (collectionView:viewForSupplementaryElementOfKind:atIndexPath:)
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.