2016-01-22 55 views
0

我有我的代碼有點問題,我使用的CollectionView與segmentedControl但在這裏,當我按下segmetedControl第2或3,我滾動的CollectionView,我得到這個錯誤的CollectionView和UISegmentedControl錯誤

*終止應用程序由於未捕獲的異常 'NSRangeException',原因: '* - [__ NSArrayI objectAtIndex:]:索引16超出範圍[0 .. 15]'

#define API_V3_CHANNEL_URL @"examples.json" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    [self fetchEntries]; 
    [self fetchEntriesWinner]; 
    [self fetchEntriesPhotos]; 

} 

- (void)fetchEntries 
{ 
    NSString *searchURL = [API_V3_CHANNEL_URL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
    NSData *searchData = [NSData dataWithContentsOfURL:[NSURL URLWithString:searchURL]]; 
    NSDictionary *searchDict =[NSJSONSerialization JSONObjectWithData:searchData options:NSJSONReadingMutableContainers error:nil]; 
    //self.readArray = [searchDict objectForKey:@"CONTESTS"]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status == %@", @"LIVE"]; 
    self.readArray = [[searchDict objectForKey:@"CONTESTS"] filteredArrayUsingPredicate:predicate]; 

    NSLog(@"%@", self.readArray); 

} 

- (void)fetchEntriesWinner 
{ 
    NSString *searchURL = [API_V3_CHANNEL_URL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
    NSData *searchData = [NSData dataWithContentsOfURL:[NSURL URLWithString:searchURL]]; 
    NSDictionary *searchDict =[NSJSONSerialization JSONObjectWithData:searchData options:NSJSONReadingMutableContainers error:nil]; 
    //self.readArray = [searchDict objectForKey:@"CONTESTS"]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status == %@", @"ARCHIVED"]; 
    self.readArrayWinner = [[searchDict objectForKey:@"CONTESTS"] filteredArrayUsingPredicate:predicate]; 

    NSLog(@"winner array : %@", self.readArrayWinner); 

} 

- (void)fetchEntriesPhotos 
{ 
    NSString *searchURL = [API_V3_CHANNEL_URL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
    NSData *searchData = [NSData dataWithContentsOfURL:[NSURL URLWithString:searchURL]]; 
    NSDictionary *searchDict =[NSJSONSerialization JSONObjectWithData:searchData options:NSJSONReadingMutableContainers error:nil]; 
    //self.readArray = [searchDict objectForKey:@"CONTESTS"]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status == %@", @"LIVE"]; 
    self.readArrayPhotos = [[searchDict objectForKey:@"CONTESTS"] filteredArrayUsingPredicate:predicate]; 

    NSLog(@"%@", self.readArray); 

} 

- (IBAction)segmentedControlAction:(id)sender 
{ 
    [self.collectionView reloadData]; 

} 

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

    switch (_segmentedControl.selectedSegmentIndex) { 
     case 0: 
      return [self.readArray count]; 
      break; 

      case 1: 
      return [self.readArrayWinner count]; 
      break; 

      case 2: 
      return [self.readArrayPhotos count]; 
      break; 

     default: 
      break; 
    } 

    return 0; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 

    static NSString *CellIdentifier = @"pictureCell"; 

    MSContestListCollectionViewCell *cell = (MSContestListCollectionViewCell *)[self.collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath]; 

    NSDictionary *searchResult = [self.readArray objectAtIndex:indexPath.item]; 
    NSDictionary *searchResult2 = [self.readArrayWinner objectAtIndex:indexPath.item]; 
    NSDictionary *searchResult3 = [self.readArrayPhotos objectAtIndex:indexPath.item]; 

    cell.titleContest.adjustsFontSizeToFitWidth = YES; 
    cell.titleContest.minimumScaleFactor = 0.5; 

    cell.pictureImageView.layer.cornerRadius = 5; 
    cell.pictureImageView.clipsToBounds = YES; 

    cell.titleView.layer.cornerRadius = 5; 
    cell.titleView.clipsToBounds = YES; 

    switch (_segmentedControl.selectedSegmentIndex) { 
     case 0: { 
      NSString *stringImage = [searchResult objectForKey:@"featuredImage"]; 

      NSString *image = [NSString stringWithFormat:@"https://srv.mediaswapp.com/%@", stringImage]; 
      [cell.pictureImageView sd_setImageWithURL:[NSURL URLWithString:image] 
            placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

      cell.titleContest.text = [searchResult objectForKey:@"description"]; 
      cell.statusContest.text = [searchResult objectForKey:@"status"]; 
      break; 
     } 
     case 1: { 
      NSString *stringImage = [searchResult2 objectForKey:@"featuredImage"]; 

      NSString *image = [NSString stringWithFormat:@"https://srv.mediaswapp.com/%@", stringImage]; 
      [cell.pictureImageView sd_setImageWithURL:[NSURL URLWithString:image] 
            placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

      cell.titleContest.text = [searchResult2 objectForKey:@"description"]; 
      cell.statusContest.text = [searchResult2 objectForKey:@"status"]; 
      break; 
     } 
     case 2: { 
      NSString *stringImage = [searchResult3 objectForKey:@"featuredImage"]; 

      NSString *image = [NSString stringWithFormat:@"https://srv.mediaswapp.com/%@", stringImage]; 
      [cell.pictureImageView sd_setImageWithURL:[NSURL URLWithString:image] 
            placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

      cell.titleContest.text = [searchResult3 objectForKey:@"description"]; 
      cell.statusContest.text = [searchResult3 objectForKey:@"status"]; 
      break; 
     } 

     default: 
      break; 
    } 

    return cell; 
} 

@end 

回答

2

您有以下三條線將開關盒內:

NSDictionary *searchResult = [self.readArray objectAtIndex:indexPath.item]; 
NSDictionary *searchResult2 = [self.readArrayWinner objectAtIndex:indexPath.item]; 
NSDictionary *searchResult3 = [self.readArrayPhotos objectAtIndex:indexPath.item]; 

應該

switch (_segmentedControl.selectedSegmentIndex) { 
    case 0: { 
     NSDictionary *searchResult = [self.readArray objectAtIndex:indexPath.item]; 
     NSString *stringImage = [searchResult objectForKey:@"featuredImage"]; 

     NSString *image = [NSString stringWithFormat:@"https://srv.mediaswapp.com/%@", stringImage]; 
     [cell.pictureImageView sd_setImageWithURL:[NSURL URLWithString:image] 
           placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

     cell.titleContest.text = [searchResult objectForKey:@"description"]; 
     cell.statusContest.text = [searchResult objectForKey:@"status"]; 
     break; 
    } 
    case 1: { 
     NSDictionary *searchResult2 = [self.readArrayWinner objectAtIndex:indexPath.item]; 
     NSString *stringImage = [searchResult2 objectForKey:@"featuredImage"]; 

     NSString *image = [NSString stringWithFormat:@"https://srv.mediaswapp.com/%@", stringImage]; 
     [cell.pictureImageView sd_setImageWithURL:[NSURL URLWithString:image] 
           placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

     cell.titleContest.text = [searchResult2 objectForKey:@"description"]; 
     cell.statusContest.text = [searchResult2 objectForKey:@"status"]; 
     break; 
    } 
    case 2: { 
     NSDictionary *searchResult3 = [self.readArrayPhotos objectAtIndex:indexPath.item]; 
     NSString *stringImage = [searchResult3 objectForKey:@"featuredImage"]; 

     NSString *image = [NSString stringWithFormat:@"https://srv.mediaswapp.com/%@", stringImage]; 
     [cell.pictureImageView sd_setImageWithURL:[NSURL URLWithString:image] 
           placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

     cell.titleContest.text = [searchResult3 objectForKey:@"description"]; 
     cell.statusContest.text = [searchResult3 objectForKey:@"status"]; 
     break; 
    } 

    default: 
     break; 
} 

的原因是,當readArray包含16個元素,並試圖顯示部分爲readArray你也將嘗試訪問索引16處的readArrayWinner,由於該數組較小,因此可能不存在。

+0

非常感謝,它的工作原理,我只是最後一個問題,當我點擊一個單元格時,什麼也沒有發生,當我點擊顯示前一個單元格的數據的第二個單元格時(或者我單擊的單元格)我認爲它顯示了錯誤的index.item(詳細視圖) –

+0

@victorbill這是一個不同的問題,因爲它與您當前的問題無關。如果你不能自己追蹤這個問題,你可以試着問第二個問題。 – luk2302

+0

鏈接:http://stackoverflow.com/questions/34949499/click-collectionviewcell-error –

0

數組包含16個對象,您將會發現objectAtIndex「16」,這意味着您在數組中找不到第17個對象,因此使用未捕獲的異常'NSRangeException'終止應用程序。

相關問題