![](/img/trans.png)
[英]NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 2 beyond bounds [0 .. 1] error with CoreData and NSFRC
[英]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.