2014-12-02 11 views
6

Mam metodę I zdać 'id' w tutaj:krach iOS: [__NSArrayI objectAtIndex:]: indeks 0 poza granice dla pustej tablicy

NSString *id = @"4bf58dd8d48988d181941735"; 
[self getNames:id]; 

Działa to dobrze, ale kiedy używać " id”z obiektu przekazany w segue:

NSString *id = _selectedStore._id; 
[self getNames:id]; 

pojawia się błąd:

'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 0 beyond bounds for empty array' 

Co się dzieje?

Oto, gdzie pojawia się błąd. Moja próba (pamiętaj, że jestem nowy) polega na wzięciu tabliczki z identyfikatorami Foursquare, zdobyciu nazwisk, a następnie uzyskaniu statusu PhotoUrl dla id. Jeśli usunę cały kod, który tworzy fotoUrl (zauważyłem w kodzie), działa bez awarii.

- (void)getNames { 
    NSMutableArray *final = [[NSMutableArray alloc] init]; 
    for (SearchVenue *object in self.venues) { 
    [Foursquare2 venueGetDetail:object._id callback:^(BOOL success, id result){ 
      if (success) { 
       NSDictionary *dic = result; 
       NSArray *venue = [dic valueForKeyPath:@"response.venue"]; 
       self.venueDetail = venue;     
       NSMutableDictionary *newVen = [NSMutableDictionary dictionary]; 
       [newVen setValue:[self.venueDetail valueForKey:@"name"] forKey:@"name"]; 
       [final addObject:newVen]; 
        [Foursquare2 venueGetPhotos:object._id limit:nil offset:nil callback:^(BOOL success, id result){ 
         if (success) { 

          NSDictionary *dic = result; 
          NSArray *photos = [dic valueForKeyPath:@"response.photos"]; 
          self.venuePhotos = photos; 

          //works when removed from here... 
          NSString *prefix = [[self.venuePhotos valueForKeyPath:@"items.prefix"] objectAtIndex:0]; 
          NSString *size = @"100x100"; 
          NSString *suffix = [[self.venuePhotos valueForKeyPath:@"items.suffix"] objectAtIndex:0]; 
          NSArray *myStrings = [NSArray arrayWithObjects:prefix,size,suffix, nil]; 
          NSString *photoUrl = [myStrings componentsJoinedByString:@"" ]; 
          //...to here 

          NSMutableDictionary *newVen1 = [NSMutableDictionary dictionary]; 
           [newVen1 setValue:photoUrl forKey:@"photoUrl"]; 
          for(int i = 0; i < [final count]; i++) { 
           [[final objectAtIndex:i] addEntriesFromDictionary:newVen1]; 
          } 
          _arrayOfPlaces = final; 
          NSLog(@"_arrayOfPlaces is %@",_arrayOfPlaces); 
          [self.resultsVC reloadData]; 
         } else { 
          NSLog(@"%@",result); 
         } 
        }]; 
      } else { 
       NSLog(@"%@",result); 
       } 
     }]; 
    } 
} 
+0

sprawdź liczbę tablic, przed sprawdzeniem obiektu w indeksie. – Savitha

+0

"id" to wbudowane słowo kluczowe dla celu C. możesz spróbować, zmieniając nazwę swojego ciągu na valId lub w dowolnym innym miejscu. – Esha

+0

Zmieniłem go na "identyfikację", ale nadal występuje błąd. – Ryasoh

Odpowiedz

2

Twój problem jest chyba tutaj:

NSString *prefix = 
[[self.venuePhotos valueForKeyPath:@"items.prefix"] objectAtIndex:0]; 

Należy to zrobić:

if ([[self.venuePhotos valueForKeyPath:@"items.prefix"] count] > 0) { 
NSString *prefix = 
[[self.venuePhotos valueForKeyPath:@"items.prefix"] objectAtIndex:0] 
... 
} else { 
// Do something for not having the prefix 
} 

jeśli chcesz być bardzo bezpieczne, co jest zawsze dobry, zrób to

if ([[self.venuePhotos valueForKeyPath:@"items.prefix"] 
         isKindOfClass:[NSArray class]] 
&& [[self.venuePhotos valueForKeyPath:@"items.prefix"] count] > 0) 

Zapewni to również, że element jest tablicą. Jeśli 1 [self.venuePhotos valueForKeyPath: @ "items.prefix"] 1 nie jest i nie reaguje na zliczanie, ulegnie awarii.

Uogólniona zasada kciuka, którą rzadko stosuje się konsekwentnie, zawsze jest sprawdzana przed uzyskaniem dostępu do tablicy przy użyciu indeksu. Jest to niezależne od tego, czy otrzymasz go za pomocą indeksu dolnego, czy obiektu ObjectAtIndex.

0
id object = __NSArrayI[i]; 

NSUInteger index = [__NSArrayI indexOfObject:object]; 

spróbować this..first sprawdzić licznik tablicy.

+2

Ten kod nie jest prawidłowym kodem. –

Powiązane problemy