簡體   English   中英

收到NSRangeException錯誤消息“objectAtIndex超出邊界”

[英]Receive NSRangeException error message “objectAtIndex beyond bounds”

在一個名為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的push控制器方法:

    -(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.
}

LevelSelectViewController中需要一個簡單的int屬性,您可以使用它來存儲已選擇的級別:

@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];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM