在一个名为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 *
的另一种方法答案 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];
}