收到 NSRangeException 错误信息 "objectAtIndex beyond bounds"

Receive NSRangeException error message "objectAtIndex beyond bounds"

在一个名为 LevelSelectViewController 的 class 中,我有这个 public 属性

    @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 的第二个 class 中,我有一个方法 setUpBoards,它(应该)获得 *levelNumber 的值。它看起来像这样:

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

在同一个 class 中,方法 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* 的另一种方法

问题是您正在将指针转换为 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.
}

您需要一个简单的 int 属性 在 LevelSelectViewController 中,您可以使用它来存储已选择的级别:

@property int levelSelected;

将所选值存储在您的按钮按下处理程序中:

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

然后您可以将其传递给 GameViewController;

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