2013-06-20 3 views
0

Я работаю над своим первым приложением iOS: кулинарной книгой, в которой хранится массив объектов рецепта. Массив объявляется как и в файле заголовка так:Потеря содержимого NSArray после ViewDidLoad

@property (nonatomic, strong) NSArray *recipeArray; 

В методе viewDidLoad я заполнить массив с рецептами из файла XML следующим образом:

self.recipeArray = [[NSArray alloc]initWithArray:arrayFromXML]; 

В рамках метода viewDidLoad, после того, как эта строка кода я могу успешно получить доступ к содержимому массива.

Проблема в том, когда я хочу получить доступ к массиву в методе prepareForSegue, массив кажется пустым. В самом начале метода prepareForSegue я положил в выходной тест заявление:

NSLog(@"Name called from segue: %@", [self.recipeArray[0] name]); 

и печатает «Имя вызывается из Segue: (нуль)

Почему это происходит Как я могу получить? содержимое массива и как приходят они не сохраняются после того, как метод viewDidLoad заканчивает выполнение?

+0

Если массив был пуст, вы получили бы сбой. Кажется, что массив был удален (заполнен). Где еще в коде вы меняете 'recipeArray'? – Wain

+1

@TBlue, так и почему это должно что-то менять? – vikingosegundo

+0

это единственное место в коде, которое я меняю recipeArray. В коде есть другие места, где я обращаюсь к нему, например, в методе cellForRowAtIndexPath: 'code'cell.textLabel.text = [self.recipeArray [indexPath.row] name]; [cell комплектRecipeForCell: self.recipeArray [указательPath.ряд]]; NSLog (@ "Рецепт для сотового набора как:% @", [self.recipeArray [indexPath.row] name]); возвратная ячейка; 'code' и, как ни странно, хорошо работает –

ответ

-1

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

NSArray *array = [[NSArray alloc]initWithArray:arrayFromXML]; 

self.recipeArray = [array mutableCopy]; 

Затем попробуйте использовать этот рецептArray в методе prepareForSegue. Я думаю, вы получите содержимое массива, как в viewDidLoad.

Удачи !!!

+2

Почему, на ваш взгляд, это поможет? Свойство не определено как изменяемое. – Wain

+2

и почему вы так думаете? – vikingosegundo

+0

Это не устранило проблему. Содержимое массива во время метода prepareForSegue по-прежнему равно нулю. –

0

Очень распространенная ошибка начинающего состоит в том, чтобы иметь несколько экземпляров объекта, как правило, контроллера вида. Это может произойти, если вы программно создаете свой контроллер представления, но контроллер также указан в файле .xib или раскадровки. Например, если вы подключили SEGUE между двумя контроллерами зрения в раскадровке, но вы также делаете что-то вроде:

MyViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"]; 
vc.dataFileName = @"TheDataFile.txt"; 

затем нескольких копий контроллера очень вероятно, ваша проблема. У вас есть тот, который вы создаете и предоставляете файл данных, как указано выше, и тот, который создается раскадрой, когда пользователь нажимает кнопку или иным образом активирует сеанс.

Попробуйте положить контрольную точку в свой метод -viewDidLoad и посмотреть, будет ли значение self (это адрес контроллера в этом случае) одинаково при каждом его нажатии.

Если ваша проблема, по сути, связана с несколькими копиями вашего контроллера вида, вы, вероятно, задаетесь вопросом, как вы должны настроить контроллер вида, если вы его не создаете. Ответ, конечно, состоит в том, что это именно то, для чего стоит -prepareForSegue:. Здесь вы можете сообщить новому контроллеру представления, какой файл получить от него, или иным образом настроить контроллер вида, чтобы он мог выполнять свою работу.

+0

Я не создаю экземпляр RecipeTableViewController, кроме того, что делается в раскадровке –

Смежные вопросы