[__NSArrayM objectAtIndex:]:索引2超出边界[0 .. 1]

时间:2014-10-22 21:38:42

标签: ios nsarray uicollectionview icarousel nsrangeexception

我是一名新的iOS开发者;我有一个解析和动态单元格的应用程序,但当我运行应用程序时,我发现应用程序崩溃,因为标题上的原因我的代码如下

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view
{

    myArray = [[NSMutableArray alloc] init];


    //create new view if no view is available for recycling

   // view = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 250.0f, 300.0f)] autorelease];

    FXImageView *imageView = [[[FXImageView alloc] initWithFrame:CGRectMake(0, 0, 250.0f, 350.0f)] autorelease];
    imageView.contentMode = UIViewContentModeScaleAspectFit;
    imageView.asynchronous = YES;
   // imageView.reflectionScale = 0.5f;
   // imageView.reflectionAlpha = 0.25f;
  //  imageView.reflectionGap = 10.0f;
    imageView.shadowOffset = CGSizeMake(0.0f, 2.0f);
    imageView.shadowBlur = 5.0f;
    imageView.cornerRadius = 10.0f;
    view = imageView;

    [ProgressHUD dismiss];

     NSString *string1 = [[NSUserDefaults standardUserDefaults] stringForKey:@"Class"];

    PFQuery *query = [PFQuery queryWithClassName:[NSString stringWithFormat:@"%@",string1]];


    query.cachePolicy = kPFCachePolicyNetworkElseCache;

    //show loader view


    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {

            myArray = [[NSMutableArray alloc] initWithArray:objects];

            PFObject *object = [myArray objectAtIndex:index];


            [file getDataInBackgroundWithBlock:^(NSData *data1, NSError *error) {
                if (!error) {

                    ((UIImageView *)view).image = [UIImage imageWithData:data1];

                    //[HUD hideUIBlockingIndicator];

                }
            }];

        }

    }];

    return view;


}

我用于第一个屏幕UICollectionView,其中包含来自解析的动态数据,如以下代码

pragma collectionView委托

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"cell";
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

    CALayer *layer = cell.layer;
    [layer setCornerRadius:8.0f];
    [layer setMasksToBounds:YES];
   // [layer setBorderWidth:1.0f];
  //  layer.backgroundColor = [UIColor whiteColor].CGColor;
    //can you click

    PFObject *imageObject = [myArray objectAtIndex:indexPath.item];
    PFFile *imageFile = [imageObject objectForKey:@"image"];
    NSString *name = [imageObject objectForKey:@"name"];

    [imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
        if (!error) {

            UIImageView *imageView = (UIImageView *)[cell viewWithTag:100];
            imageView.image = [UIImage imageWithData:data];

            UILabel *title2 = (UILabel *)[cell viewWithTag:200];
            title2.text = [NSString stringWithFormat:@"%@",name];
            title2.font = [UIFont fontWithName:@"GESSTextMedium-Medium" size:12];
        }
    }];


    return cell;
}

我需要一些帮助才能知道错误在哪里; 每次我在控制台[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]

上收到此错误

6 个答案:

答案 0 :(得分:6)

没有足够的信息。我们甚至不知道这次事故的确切线路。 myArray中的实际对象数是多少? 你在collectionView:numberOfItemsInSection:上的回报 等等..

Imho,最简单的解决方案是调试此崩溃。并找出为什么索引大于objectAtIndex:预期。试试这个:

  

1)打开"断点导航器"

     

2)点击' +'按钮并选择"添加例外断点"选项

现在,app会在调试时对任何异常使用此断点。

答案 1 :(得分:1)

致敬和欢迎,新开发者。您要了解的第一件事是发生异常的地方。要做到这一点,你需要打开“异常断点”。

您的确切方式因Xcode版本而异(感谢Apple)。假设您使用的是Xcode 6,则可以使用video here来解释它。

我认为您的旋转木马很可能会错过报告其所拥有的物品数量。或者由于某些其他原因,您试图获得一个不存在的轮播项目...当轮询使用现有范围之外的单元格索引进行查询时,可能轮播要求nil,但您假设索引有效并命中数组边界异常。在一个疯狂的猜测,可能错误是在这里的行:

…
myArray = [[NSMutableArray alloc] initWithArray:objects];
PFObject *object = [myArray objectAtIndex:index];
…

我猜测section不是myArray中的有效索引。

(顺便说一下 - myArrayobjects数组的可变副本。你为什么要这样做?你没有对myArray进行任何更改,所以似乎没有必要。)


您的集合视图委托中可能有方法collectionView: numberOfItemsInSection:。或者如果你不这样做,你可能需要一个。目前的代码是什么?

答案 2 :(得分:0)

您的问题出在这一行:PFObject *object = [myArray objectAtIndex:index];

你的索引是2,但你的数组中只有2个对象。由于数组的最大索引是1(0..1),它会崩溃。我建议看看调用该方法的位置以及如何获得超出范围的索引。

答案 3 :(得分:0)

这可能是以下两行之一:

PFObject *object = [myArray objectAtIndex:index];

PFObject *imageObject = [myArray objectAtIndex:indexPath.item];

问题是索引(或第二种情况下的indexPath.item)包含值2,但myArray的大小为2(因此唯一有效的索引是0和1)。

答案 4 :(得分:0)

最后我发现问题所在;我必须为iCarousel numberOfItems定义数组,所以代码将如下所示

- (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel
{
    //return the total number of items in the carousel

    return ([myArray count]);
    return ([titleArray count]);
    return ([priceArray count]);
    return ([sapArray count]);    
}

所以我逃脱了索引问题

感谢所有人与我分享

答案 5 :(得分:0)

请检查您正在使用的numberOfRowsInSection方法和数组计数。