Ios [\uu NSArrayM objectAtIndex:]:索引2超出范围[0..1]

Ios [\uu NSArrayM objectAtIndex:]:索引2超出范围[0..1],ios,nsarray,uicollectionview,icarousel,nsrangeexception,Ios,Nsarray,Uicollectionview,Icarousel,Nsrangeexception,我是一个新的iOS开发者;我有一个带有parse和dynamic cell的应用程序,但当我运行该应用程序时,我发现该应用程序由于标题“我的代码”上的原因而崩溃,如下所示 - (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view { myArray = [[NSMutableArray alloc] init];

我是一个新的iOS开发者;我有一个带有parse和dynamic cell的应用程序,但当我运行该应用程序时,我发现该应用程序由于标题“我的代码”上的原因而崩溃,如下所示

- (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;

    
}
- (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]);    
}
我在第一个屏幕上使用UICollectionView,其中包含来自parse的动态数据,如下代码所示

pragma集合视图委托 我需要一些帮助来知道错误在哪里;
每次我在控制台[u NSArrayM objectAtIndex:]上收到此错误时:索引2超出界限[0..1]

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


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

这可能是以下两行之一:

PFObject *object = [myArray objectAtIndex:index];


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

问候和欢迎,新开发人员。您首先要了解的是异常发生的位置。为此,需要打开异常断点

具体操作方式因Xcode版本而异,感谢苹果。假设您使用的是Xcode 6,有一个简单的例子可以解释这一点

我认为你的旋转木马很可能漏报了它拥有的物品数量。或者出于某些其他原因,您试图获取一个不存在的旋转木马项……当旋转木马使用现有范围之外的单元格索引进行查询时,它可能期望为零,但您假设该索引有效并遇到数组边界异常。粗略猜测,错误可能在于以下几行:

…
myArray = [[NSMutableArray alloc] initWithArray:objects];
PFObject *object = [myArray objectAtIndex:index];
…
我猜该节不是myArray的有效索引

顺便说一下–myArray是对象数组的可变副本。你为什么这么做?您没有对myArray进行任何更改,因此它似乎没有必要


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

没有足够的信息。我们甚至不知道这次坠机的确切路线。 myArray中的实际对象数是多少? 收集时返回的内容查看:NumberOfItems部分: 等等

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

1打开断点导航器

2点击“+”按钮并选择添加异常断点选项


现在,应用程序将在调试时对任何异常使用此断点。

最后,我发现问题出在哪里;我必须为iCarousel numberOfItems定义数组,因此代码如下

- (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;

    
}
- (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]);    
}
所以我避开了索引问题


感谢大家与我分享

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

是;你是完全正确的,因为当我使用断点时,它在标记这一行,我使用po方法,当我把index等于2时,它的readnull;但我不知道如何解决这个问题;当我把索引设为1时,它工作得很好,但我在caresoulno上得到了相同的项;第一行的问题是因为当我使用断点时,它会标记在那一行上,但我不知道如何解决你指的是哪一行?我提到的第一个或您的函数中的第一个?PFObject*object=[myArray objectAtIndex:index];好啊现在添加这行代码NSLog@%i%i,index,myArray.count;就在上面。您将看到您正在尝试访问索引2,但数组的计数为2。您的问题是,您应该只在index