ios - CollectionView 和 UISegmentedControl 错误

标签 ios objective-c uicollectionview uisegmentedcontrol

我的代码中有一个小问题,我将 CollectionView 与 segmentedControl 结合使用,但是当我按下 segmetedControl 的第 2 部分或第 3 部分并滚动 CollectionView 时,出现此错误

* Terminating app due to uncaught exception 'NSRangeException', reason: '* -[__NSArrayI objectAtIndex:]: index 16 beyond bounds [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

最佳答案

您必须在 switch case 中移动以下三行:

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 的部分时,您还将尝试访问 readArrayWinner在索引 16 处可能不存在,因为该数组较小。

关于ios - CollectionView 和 UISegmentedControl 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34947483/

相关文章:

iphone - NSMutableArray 访问问题

iphone - 如何添加pull tableview up来刷新uitableview里面的数据

ios - Alamofire - 不接受 failureCallBack 中的错误

iphone - 将 CFTypeRef(又名 const void*)发送到类型为 'void *' 的参数会丢弃限定符

ios - 始终运行的方法? (Xcode/iOS/objective-C )

ios - Sprite Kit - 无法从对象获取自定义类数据

ios - 更改 dismissViewControllerAnimated 的动画

ios - UIImageView的自动调整

ios - 执行展开转场后新数据未更新

ios - 使用 UICollectionView 创建网格布局