Загрузка 2 Xibs, одна из Xib, была получена мутация при перечислении и неправильный тип - PullRequest
1 голос
/ 24 февраля 2012

Итак, у меня множество проблем, на каждую из которых есть ответы, но они не объединены.Я загружаю Xibs 2 способами.Благодаря Янгу я использую awakeAfterUsingCoder: (NSCoder *) aD {} и могу получить начальную загрузку пользовательского представления (в котором есть вид прокрутки с пользовательскими представлениями внутри).

Затем я загружаю внутренние представления, которые используют [NSBundle] ... loadNibNamed: @ "Name"] objectAtIndex: 0] для программной загрузки из Xib.

Пока что я успешно загружаю Xib по коду, а Xib внутриXib (без дополнительного кода кроме AwakeAfter).Хорошо, хорошо ... но ...

Позже, когда я иду, чтобы добавить мини-представление к scrollView, используя параметры loadNib ... ... я получаю это: код ошибки ...был мутирован при перечислении.

Что за?Так что я, видимо, изменяю свой массив (изначально я думал, что при добавлении я перечислял подпредставления вида прокрутки, но нет ... я не настолько небрежен).Ну это параллелизм?Нет, я прямо зацикливаюсь и звоню делегатам, чтобы сказать: «Эй, я изменил данные, теперь добавляю в подпредставления».но это не так, если честно ... Вам понравится это: давайте предположим, что я назвал свои взгляды таковымиBigScrollView (содержит внутренние представления), а затем это ... InnerView * iv;

Затем я делаю что-то вроде этого: InnerView * temp = [[[NSBundle mainBundle] loadNibNamed: @ Владелец "InnerView": собственные параметры: nil] objectAtIndex: 0];и даже приведу его иногда.Затем, перед тем как он падает, я решаю NSLog (@ "Class:% @", NSStringFromClass ([temp class]));Угадай, что печатает?BigScrollView.Даже отладка и использование PO objectName.

Как это происходит?

Дальнейший поиск дал результаты о том, что «AwakeFromNib вызывается каждый раз, при каждом просмотре, который вы загружали изПеро, например, если вы загружаете новый перо, все ваши старые также получают вызов ".Ну, это просто странно ... но позже я понял, что, вероятно, и это значит, что ...

  • (id) awakeAfterUsingCoder: также вызывается.Это означает, что когда я использую загрузочный вызов InnerView, он автоматически делает вызов BigScrollView: awakeAfterUsingCoder:

После дальнейшей проверки этого с помощью NSLogs я был прав.

Так что я сунулся вэта строка, если (! [self isKindOfClass: [класс BigScrollView]]) возвращает self;

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

Но это не работает.

Я являюсь основным сторонником использования Native iOS, как по его скорости, так и по возможности использовать пользовательские Xibs.Так что не поймите меня неправильно, я критикую их без особых чувств и часто придирчиво к руководствам, например, как MKMapRect не объясняется, если вы не просматриваете WWDC 2010 или UIScrollView имеет «должен» в своих спецификациях, просто потому, что я искренне желаючтобы лучше понять их и использовать инструменты ... поэтому я говорю это с легким сердцем: как яблоко позволило не только сказать «int num» и получить число с плавающей запятой, но и многопоточное что-то, когда его не спросили?Есть ли общий процесс, который я не получаю?

Я, скорее всего, просто не буду создавать экземпляр Xib с xib и вызывать оба через код, просто поместив его вручную, и посмотрим, работает ли он.Но я открыт для любых ответов, так как я не нашел это соединение вопроса о SO.

1 Ответ

1 голос
/ 13 апреля 2012

awakeFromNib вызывается один раз для каждого представления в активном окне, для каждого представления, для которого создается экземпляр. Другими словами, используйте статическую переменную, чтобы предотвратить 2 вызова. Даже тогда написание моего собственного кода инициализации работало лучше, чем готовые решения Apple.

Также обратите внимание, что обычно это работает, вставьте инициализацию в эту функцию, когда вы знаете, что она будет вызываться только один раз для каждого просмотра: - (void) didMoveToSuperview {} или оконная функция

...