【问题标题】:CollectionView and UISegmentedControl errorCollectionView 和 UISegmentedControl 错误
【发布时间】:2016-04-29 02:22:51
【问题描述】:

我的代码有一点问题,我使用了带有分段控制的 CollectionView,但是当我按下 segmetedControl 的第 2 或 3 部分并滚动 CollectionView 时,我收到了这个错误

* 由于未捕获的异常 '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

【问题讨论】:

    标签: ios objective-c uicollectionview uisegmentedcontrol


    【解决方案1】:

    您必须在开关盒内移动以下三行:

    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,因为该数组较小,该索引可能不存在。

    【讨论】:

    • 非常感谢,它有效,我只有最后一个问题,当我点击一个单元格时,什么也没有发生,当我点击显示前一个单元格数据的第二个单元格时(或我第一次点击的那个)在简历中我认为它向我显示了错误的 index.item(在详细视图中)
    • @victorbill 这是一个不同的问题,因为它与您当前的问题无关。如果您无法自己找出问题所在,您可以尝试就该问题提出第二个问题。
    【解决方案2】:

    数组包含 16 个对象,您将找到 objectAtIndex "16",这意味着您在数组中找到第 17 个不可用的对象,因此终止应用程序并出现未捕获的异常 'NSRangeException'。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多