В одном классе называется LevelSelectViewController, у меня есть открытое свойствоПолучить сообщение об ошибке NSRangeException «objectAtIndex за пределы»
@property (nonatomic, strong, getter=getLevelNumber) NSNumber *levelNumber;
, которая сохраняет целочисленное значение, основанное на * выборе сенсорного UIButton с помощью метода
- (IBAction)buttonPressedSoWhatNumber:(id)sender
{
UIButton *button = (UIButton *)sender;
int row = button.tag;
_levelNumber = [NSNumber numberWithInt:row];
}
Когда я положил точку останова в конце метода, чтобы увидеть, вызывает ли мое взаимодействие касания правильный результат на основе того, что я закодировал (когда я нажимаю кнопку 1, действительно), _levelNumber читает 0 (что должно). У меня также есть метод геттера, написанный для него.
Теперь, в этом втором классе под названием 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 (который должен работать, учитывая я только позицию 0 в мой PLIST напечатал. ...... который, опять же, я проверял, работал другим способом).
ДОБАВИТЬ В ЭТОМ. Вот еще один важный метод:
-(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 *
Я получаю подозрение, когда я вижу прямой alloc/init UIViewController в локальную переменную и контроллер представления не представлен; Это означает, что контроллер просмотра будет освобожден, как только метод выйдет. Какая строка кода выбрасывает исключение? Похоже, что индекс массива исходил из числа, которое не было инициализировано, что неудивительно, поскольку вы не устанавливаете 'levelNumber' где-нибудь, когда вы создаете контроллер вида – Paulw11
Да, вы правы, поэтому значение передается в эти 5 инициализаторов 525827056, когда он должен быть 1 (plist находится за пределами допустимого диапазона). Это означает, что метод setUpBoards не передает целочисленное значение. Когда я устанавливаю точки останова в методе setUpBoards, я не могу отобразить какие-либо значения, потому что исключение выбрано где-то посередине всего этого. УровеньNumber устанавливается в другом файле, LevelSelectViewController, и я получаю его в GameViewController. Если я неправильно получаю это свойство. – Frank
Я думаю, вам нужно получить ссылку на фактический контроллер выбора уровня, который у вас есть на экране, а не просто на создание нового – Paulw11