2016-05-19 4 views
1

В одном классе называется 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 *

+0

Я получаю подозрение, когда я вижу прямой alloc/init UIViewController в локальную переменную и контроллер представления не представлен; Это означает, что контроллер просмотра будет освобожден, как только метод выйдет. Какая строка кода выбрасывает исключение? Похоже, что индекс массива исходил из числа, которое не было инициализировано, что неудивительно, поскольку вы не устанавливаете 'levelNumber' где-нибудь, когда вы создаете контроллер вида – Paulw11

+0

Да, вы правы, поэтому значение передается в эти 5 инициализаторов 525827056, когда он должен быть 1 (plist находится за пределами допустимого диапазона). Это означает, что метод setUpBoards не передает целочисленное значение. Когда я устанавливаю точки останова в методе setUpBoards, я не могу отобразить какие-либо значения, потому что исключение выбрано где-то посередине всего этого. УровеньNumber устанавливается в другом файле, LevelSelectViewController, и я получаю его в GameViewController. Если я неправильно получаю это свойство. – Frank

+0

Я думаю, вам нужно получить ссылку на фактический контроллер выбора уровня, который у вас есть на экране, а не просто на создание нового – Paulw11

ответ

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]; 
} 
+0

BOOM! Удивительно, спасибо за помощь. Это сделал трюк, и я даже не знал, что вы могли бы это сделать до сих пор ... как опытный новичок, это было очень полезно. – Frank

0

Проблема заключается в том, что вы бросаете указатель на междунар.

@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. 
} 
+0

Хотя это правильно, в ней отсутствует основная проблема, что просто создание экземпляра нового 'LevelSelectViewController' не даст значимого значения. – Paulw11

+0

Видел, что в вашем предыдущем комментарии. Но хотелось сосредоточиться на двух основных ошибках. – drekka

+0

Существует также ряд проблем с дополнительным кодом. Например, используя старинную индексацию массивов, добавив под-представление ячейки для себя и проблемы с повторным использованием. Одна вещь за раз. – drekka