2012-10-14 9 views
14

आईओएस 6 और नए UICollectionView का उपयोग करते हुए मैं UIViewController पर 2 UICollectionViews है और एक स्टोरीबोर्ड का उपयोग कर रहा हो तो निम्न त्रुटि जब मैं UICollectionView के आसपास क्लिक करें मैं नहीं यकीन है कि क्यों कर रहा हूँ यह हो रहा है और गूगल रिटर्न 0 परिणाम इस त्रुटि के लिए ...अभिकथन विफलता - [UICollectionViewData numberOfItemsBeforeSection:]

2012-10-13 20:30:06.421 MyApp[768:907] Assertion failure in -[UICollectionViewData numberOfItemsBeforeSection:], /SourceCache/UIKit/UIKit-2372/UICollectionViewData.m:415
2012-10-13 20:30:06.427 MyApp[768:907] Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'request for number of items before section 2147483647 when there are only 1 sections in the collection view'

मैं सब पर धारा का उपयोग नहीं करते हैं और यह सिर्फ 1 अनुभाग के लिए निर्धारित किया:

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
{ 
    return 1; 
} 

यह तब होता है जब मैं UICollectionView क्षेत्र पर पर क्लिक करें (बेतरतीब ढंग से प्रतीत होता है) मैं कोड का एक टुकड़ा UICollectionView से तत्व हटाने के लिए:

[tilesArray removeObjectAtIndex:indexPath.row]; 
[self.tilesCollectionView reloadData];   
[resultsArray addObject:str]; 
[self.resultsCollectionView reloadData]; 

यहाँ कैसे सरणियों UICollectionViews

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 

    if(collectionView.tag == 2) 
     return [resultsArray count]; 
    else 
     return [tilesArray count]; 
} 
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

    if(collectionView.tag == 2) 
    { 
     static NSString *cellIdentifier = @"ResultCell"; 
     ResultCell *cell = (ResultCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; 

     cell.mainImage.image = [UIImage imageNamed:currentArtContainer.tileMainImage]; 

     NSString *cellData = [resultsArray objectAtIndex:indexPath.row]; 
     [cell.titleLabel setText:cellData]; 

     return cell; 
    } 
    else 
    { 
     static NSString *cellIdentifier = @"TileCell"; 
     TileCell *cell = (TileCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; 

     cell.topImage.image = [UIImage imageNamed:currentArtContainer.tileTopImage]; 

     cell.mainImage.image = [UIImage imageNamed:currentArtContainer.tileMainImage]; 

     NSString *cellData = [tilesArray objectAtIndex:indexPath.row]; 
     [cell.titleLabel setText:cellData]; 

     return cell; 
    } 
} 
को झुका है

कृपया मुझे इस समस्या को हल करने में मदद। यह भी सुनिश्चित नहीं है कि मैं UICollectionView आंतरिक कोड से आने के बाद से अपवाद कैसे प्राप्त कर सकता हूं। यह भी उल्लेख करना भूल गया कि मैं UICollectionView के लिए एक कस्टम लेआउट का उपयोग कर रहा हूं लेकिन मुझे नहीं पता कि यह इस मुद्दे से संबंधित है या नहीं। आपकी मदद के लोगों के लिए फिर से

धन्यवाद!

संपादित करें: मैं के बाद सभी लेआउट पद्धतियों को बुलाया जा रहा है अपवाद हो रही है ... यहाँ मेरी कस्टम लेआउट ... मैं अभी भी यकीन है कि कैसे मेरे सारे कोशिश पकड़ ब्लॉक के बाद से यह तय करने के लिए नहीं कर रहा हूँ है जाल नहीं त्रुटि कर ...

- (void)prepareLayout 
{ 
    NSLog(@"In prepareLayout."); 

    [super prepareLayout]; 
    _cellCount = [[self collectionView] numberOfItemsInSection:0]; 
} 

- (CGSize)collectionViewContentSize 
{ 
    NSLog(@"In collectionViewContentSize."); 
    @try { 

     CGSize csize = [self collectionView].frame.size; 
     NSLog(@"In here."); 
     return csize; 
    } 
    @catch(NSException *exception) 
    { 
     NSLog(@"collectionViewContentSize %@: %@",[exception name],[exception reason]); 
    } 

} 

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    @try { 

    NSLog(@"In layoutAttributesForItemAtIndexPath. item %d", indexPath.row); 


    UICollectionViewLayoutAttributes* attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; 

    attributes.size = CGSizeMake(ITEM_SIZE, ITEM_SIZE); 

    NSLog(@"firstRun %d", self.firstRun); 
    //NSLog(@"panStatus %@", self.panStatus); 

    if (self.firstRun == 0) { 
     CGFloat x = 0, y = 0; 
     CGFloat boundx = self.collectionView.frame.size.width * 0.70; // Use the whole canvas 
     CGFloat boundy = self.collectionView.frame.size.height * 0.70; // Use the whole canvas 
     while (x < 50 || x > boundx) x = arc4random() % (int)boundx + indexPath.item; 
     while (y < 50 || y > boundy) y = arc4random() % (int)boundy + indexPath.item; 

     NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 
     if (self.positions) 
      dictionary = [self.positions mutableCopy]; 
     [dictionary setObject:[NSValue valueWithCGPoint:CGPointMake(x, y)] forKey:@(indexPath.item)]; 
     if (!self.positions) 
      self.positions = [[NSDictionary alloc] init]; 
     self.positions = dictionary; 

     attributes.center = CGPointMake(x, y); 
    } else if (self.firstRun > 0) { 
     CGPoint point = [[self.positions objectForKey:@(indexPath.item)] CGPointValue]; 
     attributes.center = CGPointMake(point.x, point.y); 
    } 

    NSLog(@"END layoutAttributesForItemAtIndexPath. item %d", indexPath.row); 
     return attributes; 

    } 
    @catch(NSException *exception) 
    { 
     NSLog(@"layoutAttributesForItemAtIndexPath %@: %@",[exception name],[exception reason]); 
    } 
} 

-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 
{ 
    @try { 

    NSLog(@"layoutAttributesForElementsInRect ..."); 

    NSMutableArray* attributes = [NSMutableArray array]; 
    for (NSInteger i=0 ; i < self.cellCount; i++) { 
     NSIndexPath* indexPath = [NSIndexPath indexPathForItem:i inSection:1]; 
     [attributes addObject:[self layoutAttributesForItemAtIndexPath:indexPath]]; 
    } 
    NSLog(@"END layoutAttributesForElementsInRect ..."); 
     return attributes; 

    } 
    @catch(NSException *exception) 
    { 
     NSLog(@"layoutAttributesForElementsInRect %@: %@",[exception name],[exception reason]); 
    } 
} 
+0

क्या आपके द्वारा उपयोग की जाने वाली मुख्य दृश्य नियंत्रक श्रेणी UICollectionViewDataSource प्रोटोकॉल को लागू करती है? क्या आपने UICollectionView के लिए डेटा स्रोत के रूप में अपना व्यू कंट्रोलर (या जो कुछ भी) सेट किया था? – Cashew

+0

हां। यह 2 प्रोटोकॉल लागू करता है: UICollectionViewDelegate और UICollectionViewDataSource। मैंने इसे डेटा स्रोत के साथ-साथ 2 UICollectionViews के प्रतिनिधि के रूप में सेट किया है। – user1744168

उत्तर

6

यहाँ कुंजी अपने त्रुटि से इस नंबर है:

2147483647

यह NSNotFound की सांख्यिक मान है। कहीं न कहीं अपने कोड में आप एक सरणी के खिलाफ indexOfObject: की तरह कुछ कर रही है, और एक वर्ग या आइटम सूचकांक है, जो त्रुटि पैदा के रूप में अपने संग्रह को देखने या लेआउट तरीकों में से एक में इस बात का परिणाम गुजर रहे हैं। यह आपके प्रश्न में पोस्ट किए गए कोड में नहीं हो रहा है, लेकिन उम्मीद है कि आप इसे अभी ढूंढ पाएंगे।

+1

ऐसा लगता है कि मेरे कस्टम लेआउट के कारण समस्या आ रही है ... – user1744168

4

मैं सिर्फ इस में भाग अपने आप पर जोर। इसे निकाल दिया गया क्योंकि मैं संग्रह डेटा को टच (स्वाइप) ईवेंट पर पुनः लोड कर रहा था।

प्रारंभिक स्पर्श (प्रारंभ) ने didHighlightItemAtIndexPath: संदेश ट्रिगर किया, और अगला संग्रह डेटा बदल गया (स्वाइप के माध्यम से), और फिर यह स्पर्श (लिफ्ट) पर didUnhighlightItemAtIndexPath: संदेश ट्रिगर करने में विफल रहा।

- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

मुझे आशा है कि इस में किसी और चल रहा है में मदद करता है:

जब से मैं पर प्रकाश डाला की जरूरत नहीं है, समाधान मेरी नियंत्रक में इस विधि को लागू किया गया था।

+1

मैं बस कहना चाहता था, मेरी समस्या एक लंबी प्रेस टच इवेंट पर संग्रह डेटा को पुनः लोड कर रही थी। ReloadData को हटाने से मेरी समस्या ठीक हो गई। –

9

इशारा पहचानकर्ता से देरी टच बेगन सेटिंग में मदद मिली, यह एक इशारा पहचानकर्ता से पुनः लोडडाटा चलाते समय ऐसा हुआ था।

3

कभी नहीं एक विधि एक इशारा पहचानकर्ता द्वारा निष्पादित पर एक UICOllectionView के डेटा को फिर से लोड।इस नियम के बाद इस समस्या को पूरी तरह से हल किया गया। UICollectionView में हाइलाइटिंग को निष्क्रिय करने के लिए डाल्ट्सी के सुझाव से त्रुटि भी रोकती है लेकिन सभी "didSelectItemAtIndexPath" प्रतिनिधि संदेशों को भी निष्क्रिय कर देती है। सावधान रहें क्योंकि आप लगभग बेकार UICollectionView के साथ समाप्त हो सकते हैं - जैसे मैंने कुछ मिनट पहले किया था।

5

यह मेरे लिए काम किया:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.collectionView reloadData]; 
}); 
+0

जीयूआई में किसी भी बदलाव को मुख्य धागे से ट्रिगर करने की आवश्यकता है। किसी ब्लॉक, देरी या इशारा पहचानकर्ता से UICollectionView को बदलते या रीफ्रेश करते समय, आपको इसे मुख्य कतार पर प्रेषित करने की आवश्यकता होती है (जैसा ऊपर @ हैम्पडेन 123 द्वारा वर्णित है)। – ripegooseberry

0

हाइलाइटिंग अक्षम करने के बजाय, मैं पाया है कि सुनिश्चित करें कि कोई कोशिकाओं हाइलाइट किया जाता है से पहले बुला reloadData त्रुटि "से पहले खंड मदों की संख्या के लिए अनुरोध" से बचाता है बना रही है। यह

UICollectionViewController.CollectionView.deselectItemAtIndexPath विधि या DeselectItem Xamarin में है।

मैं मॉडल डेटा में वर्तमान में चयनित आइटम को एक हैंडल सहेजता हूं, संग्रह दृश्य की हाइलाइटिंग को साफ़ करता हूं, आइटम्स के लिए नए एनएसआईएंडएक्सपैथ की गणना करता हूं, और फिर रीलोडडाटा कॉल करता हूं। पहले चयनित आइटम को संभवतः नई एनएसआईएनएक्सएक्सपाथ संपत्ति के माध्यम से ढूंढने के लिए हैंडल का उपयोग करके चुना जाता है।

selectItemAtIndexPath:animated:scrollPosition: या SelectItem Xamarin में।

संबंधित मुद्दे