收到NSRangeException错误消息“objectAtIndex超出边界”

时间:2016-05-19 01:19:44

标签: ios objective-c nsrangeexception

在一个名为LevelSelectViewController的类中,我有这个公共属性

    @property (nonatomic, strong, getter=getLevelNumber) NSNumber *levelNumber;

使用方法

存储基于UIButton *触摸选择的int值
     - (IBAction)buttonPressedSoWhatNumber:(id)sender
     {
         UIButton *button = (UIButton *)sender;
         int row = button.tag;
         _levelNumber = [NSNumber numberWithInt:row];
     }

当我在方法的末尾放置一个断点,看看我的触摸交互是否根据我编码的内容触发了正确的结果(当我按下按钮1时,真的),_levelNumber读取0(它应该)。我也为它写了一个getter方法。

现在,在第二个名为GameViewController的类中,我有一个方法setUpBoards,它应该(*)获取* levelNumber的值。它看起来像这样:

    - (void)setUpBoards {
        LevelSelectViewController* level = [[LevelSelectViewController alloc] init];
        [level getLevelNumber];
        [self createLevelModel:(int)level];
    }

在同一个类中,方法createLevelModel:(int)levelIndex使用该值传递给5个初始化方法,这些方法访问Levels.plist文件以加载我的游戏数据。

基本上,这个数字表示我按下的级别按钮,并使用该数字加载正确的级别。另一方面,我已经验证了这5个初始化方法与从我的Levels.plist文件中加载数据一起工作。

现在,在从LevelSelectViewController到GameViewController的转换之间,我收到NSRangeException错误消息:

   'NSRangeException', reason: '-[__NSCFArray objectAtIndex:]: index (554166800) beyond bounds (1)'

即使按下1按钮(这应该可以正常工作,因为我只在我的plist中输入了项目0 .......再次,我验证了使用其他方式工作)。

添加到此。这是另一个重要的方法:

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

        static NSString *cellIdentifier = @"cvCell";
        CVCell *cell = (CVCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
        NSMutableArray *data = [self.dataArray objectAtIndex:indexPath.section];
        NSString *cellData = [data objectAtIndex:indexPath.row];
        [cell.buttonClick setTag:indexPath.row];
        [cell.buttonClick addTarget:self action:@selector(buttonPressedSoWhatNumber:)
           forControlEvents:UIControlEventTouchUpInside];
        [cell addSubview:cell.buttonClick];
        return cell;
    }

有什么见解?

这是从LevelSelectViewController到GameViewController的推送控制器方法:

    -(IBAction)buttonPressed:(id)sender {
         GameViewController* obj = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:nil];
         [self.navigationController pushViewController:obj animated:YES];
    }

buttonPressed:是给予UIButton *

的另一种方法

2 个答案:

答案 0 :(得分:0)

问题是您正在转换指向int的指针。

@property (nonatomic, strong, getter=getLevelNumber) NSNumber *levelNumber;

定义指向NSNumber类型对象的指针。

[self createLevelModel:(int)level];

NSNumber *投射到int

您还有另一个错误,即您将level设置为视图控制器并调用getLevelNumber但实际上并未使用返回的值。所以这就是我要做的。首先,您不需要定义NSNumber,也不需要自定义getter。只需使用:

@property (nonatomic, assign) int levelNumber;

然后这变得非常简单:

- (void)setUpBoards {
    LevelSelectViewController* levelSelectViewController = [[LevelSelectViewController alloc] init];
    [self createLevelModel: levelSelectViewController.levelNumber]; // Always going to be zero at this point.
}

答案 1 :(得分:0)

您需要int中的简单LevelSelectViewController属性,可用于存储已选择的关卡:

@property int levelSelected;

将所选值存储在按钮处理器中:

- (IBAction)buttonPressedSoWhatNumber:(UIButton *)sender
{
     self.levelSelected = sender.tag;
}

然后,您可以将其传递到int;

上的相应GameViewController媒体资源
-(IBAction)buttonPressed:(id)sender {
     GameViewController* obj = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:nil];
     obj.level = self.selectedLevel
     [self.navigationController pushViewController:obj animated:YES];
}