Еще один крик о помощи по этому предупреждению.
Прежде всего, я рассмотрел все вопросы здесь, в другом месте, и ни один из них, похоже, не подходит к моей ситуации. Он не имеет ничего общего с блоками оповещений и отставкой в качестве первого респондента, а также не выполняет анимацию перед отображением представлений. Моя проблема возникает при создании пользовательской клавиатуры на основе UIView.
Во-вторых, я считаю, что могу заставить предупреждение появляться / исчезать по желанию. Я просто очень смущен тем, почему, поэтому я ищу больше объяснения, чем решения.
Слишком много кода для публикации здесь, поэтому я просто дам краткое описание того, что происходит:
ViewController "Calc" создает экземпляр пользовательского "DataView" на основе UIView в методе loadView VC, а затем добавляет его в качестве дополнительного представления VC.
«DataView» создает экземпляр пользовательского UITextField на основе «TextFieldKPD» в методе init DataView
TextField создает экземпляр пользовательской «KeyPad» на основе UIView в методе инициализации TextField и назначает эту KeyPad входному представлению TextField.
«KeyPad» создает 13 UIButton-ов типа UIButtonTypeCustom, считывает и присваивает «нажатые» и «не нажатые» изображения для каждой кнопки, а также задает действия для кнопок. Затем он добавляет каждую кнопку как подпредставление себя. (Управляя, когда в жизненном цикле UIView клавиатуры, эта конструкция происходит, я могу настроить предупреждение wait_fences: см. Ниже.)
ViewController «Calc» - это тот, который изначально представлен пользователю. Я отследил предупреждение wait_fences, возникающее после окончания метода Calc viewDidLayoutSubViews и до вызова его метода viewDidAppear. Обратите внимание, что клавиатура не отображается при отображении Calc.
Кажется, я могу управлять действием предупреждения wait_fences, изменяя конструкцию клавиатуры:
Если UIB-кнопки создаются и добавляются как подпредставления в методе init клавиатуры, тогда я получу предупреждение, один раз и только один раз.
Если вместо этого кнопки создаются и добавляются в метод layoutSubViews клавиатуры, то предупреждение не отображается. (Но клавиатура эффективно не создается, пока я не нажму на TextField - тем не менее, предупреждения wait_fences тоже нет)
В loadView Calc нет анимации или чего-либо еще. Это экземпляр и назначить все вниз.
Так есть какие-нибудь комментарии к этой версии wait_fences?
РЕДАКТИРОВАТЬ 1, 30 января - теперь с еще большим замешательством!
Мне было скучно сегодня утром, поэтому я решил поиграть со своим кодом, чтобы посмотреть, смогу ли я лучше изолировать генерацию предупреждения. Я сузил его до следующего, абсолютно бесполезного кода, с помощью которого я теперь могу вызвать предупреждение:
-(void)loadImages
{
UIImage* image;
for(int i=0; i<16; i++) {
image = [UIImage imageNamed:@"StupidFileNameThatDoesNotExist"];
}
}
Если я выполняю [self loadImages]
в методе init KeyPad
, появляется предупреждение. Но этот код ничего не делает, так как файл не существует. Я считаю, что если счетчик цикла достаточно мал, чтобы предупреждение исчезло, но я не определил нижний предел.
Если я заменим фактическую загрузку изображения на
[UIImage imageWithContentsOfFile:@"StupidFileNameThatDoesNotExist"]
и все еще вызывать метод во время KeyPad
init, тогда я не получаю предупреждение. Одно из очевидных различий между этими двумя способами загрузки изображения заключается в том, что imageNamed
кэширует изображение внутри.
Так что я склоняюсь к ответу Джорджа, что это внутренняя ошибка Apple.
Редактировать 2, 1 февраля - Джим, но не так, как мы его знаем
Так что я убедил себя, что именно кеширование в классе UIImage, очевидно, вызывало проблему. Что с этим делать? Ну, напишите, конечно, мой собственный кеш изображений !!
Итак, я начал подключаться, вырывать тот код, который пытался загрузить недействительные изображения, и получил точку, где я сгенерировал нужные мне имена файлов и передал их моему контроллеру кеша.Таким образом, чтобы убедиться, что все начинает объединяться, в контроллере кеша я генерировал сообщение NSLog для каждой попытки кешировать изображение - ничего более - просто записать имя файла.
И угадайте, что - я получаюопять глупое предупреждение.Из-за отсутствия реальной работы.
Я могу только заключить, что существует какое-то внутреннее состояние гонки iOS, которое я запускаю, когда добавляю дополнительный код в метод init KeyPad
.И что я ничего не могу сделать, чтобы смягчить это.Все, что я могу сделать, - это надеяться, что это предупреждение будет добрым.
Правка 3, Акт Гамлета, сцена 1, сцена 4: Что-то гнилое в штате Дания
Сохраняя то же самоекод, как в редакторе 2, я закомментировал заявление NSLog.И предупреждение ушло.Я кладу его обратно, и появляется предупреждение.
Итак, мой код:
-(void)loadImages
{
// Iterate over button definitions and cache the required images
for(int i=0; i<numKeys; i++) {
if (![imageCache imageExistsForTag:keyTags[i]]) {
[imageCache addImageFile:[NSString stringWithFormat:@"%s_NP.png",keyNames[i]] forTag:keyTags[i]];
}
if (![imageCache imageExistsForTag:keyTags[i]+pressedOffset]) {
[imageCache addImageFile:[NSString stringWithFormat:@"%s_P.png",keyNames[i]] forTag:keyTags[i]+pressedOffset];
}
}
}
И:
-(void)addImageFile:(NSString*)imageFile forTag:(int)tag
{
NSLog(@"Adding tag:%d for file %@", tag, imageFile);
}
С этим оператором NSLog, управляющим внешним видом
Редактировать 4 февраля 2 - Добро пожаловать в Храм Судьбы
Принимая комментарии Аллена близко к сердцу, я перестроил свою клавиатуру как XIB и вместо нее загрузил еевручную пытаться построить представление.Конечно, это ничего не исправило.Я надеялся, что загрузка Nib произойдет за пределами того, что когда-либо вызывает проблему.
У меня такое чувство, что я сталкиваюсь с состоянием гонки в loadView of Calc и некоторой внутренней активностью iOS,Если я выполняю слишком много работы внутри loadView, я пересекаю черту и отключаю предупреждение wait_fences.И что клавиатура является симптомом, а не основной причиной.То есть это могло быть любое действие, просто клавиатура была последней вещью, которую я делал до того, как начало появляться предупреждение.Я просто хотел бы, чтобы я действительно знал, каковы были ограничения, которые я фактически пересекал и не спотыкался в темноте.