Как загружаются XIB для локализованных приложений? - PullRequest
6 голосов
/ 13 мая 2011

Я обнаружил, что после нескольких дней успешного запуска и отладки локализованных приложений в Simulator он (или процесс развертывания XCode) перешел в состояние, в котором, если для Simulator был выбран один из моих поддерживаемых локальных языков, произойдет сбой.при запуске со следующим стеком:

3   CoreFoundation                      0x01780e6a +[NSException raise:format:] + 58
4   UIKit                               0x008050fa -[UINib instantiateWithOwner:options:] + 2024
5   UIKit                               0x00806ab7 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 168
6   UIKit                               0x0060c17a -[UIApplication _loadMainNibFile] + 172
7   UIKit                               0x0060ccf4 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 
8   UIKit                               0x00617617 -[UIApplication handleEvent:withNewEvent:] + 1533
9   UIKit                               0x0060fabf -[UIApplication sendEvent:] + 71
10  UIKit                               0x00614f2e _UIApplicationHandleEvent + 7576
11  GraphicsServices                    0x01e13992 PurpleEventCallback + 1550

Происходит сбой, поскольку приложению UIA не удается загрузить файл MainWindow.nib:

Завершение работы приложения из-за неперехваченного исключения 'NSInternalInconsistencyException', причина:' Не удалось загрузить NIB в комплекте: 'NSBundle /.app> (загружен)' с именем 'MainWindow' '

При локализации приложения у вас есть несколько вариантов.Вы можете выполнить одно (или оба) из следующих действий:

  • Локализовать каждый загружаемый файл Xib на основе языка на устройстве.Таким образом, ваш локализованный пользовательский интерфейс полностью настроен из Interface Builder.
  • Вы можете настроить файл Localizable.strings для каждой языковой цели и получить доступ к строкам в ней из кода.

Я выбрал позднее, потому что я хотел, чтобы все мои локализованные строки были в одном месте (чтобы их можно было перевести все сразу).Это означает, что в моем проекте нет файлов xib в директориях, зависящих от языка (fr.lproj, zh-Hant.lproj и т. Д.).Вместо этого у меня есть en.lproj, полный всех моих xib-файлов (nib-файлов после их создания) и специфичных для языка каталогов, содержащих соответствующие переведенные файлы Localizable.strings.

Как я уже упоминал, это работало нормально дляпару дней.Сегодня (и я не уверен точно, в какой момент) приложение на симуляторе начало зависать при запуске.Установка приложения на устройстве работала нормально, а запуск приложения на симуляторе в английском режиме работал нормально.

После долгих перебоев я понял, что симулятор зависал, потому что он искал его nib-файлыв каталоге для конкретного языка (fr.lpro, sz-Hant.lproj, ja.lproj в зависимости от языковых настроек).

Таким образом, кажется, что симулятор находится в состоянии, в котором он не выглядит по умолчаниюязыковой каталог (en.lproj) после того, как он не может найти перо в специфическом для языка каталоге.

Я обошел проблему, зайдя в каталог приложения для симулятора (на основе сообщения об исключении выше):

/ Пользователи /.../ Библиотека / Поддержка приложений / iPhone Simulator / 4.3 / Приложения //. App

Затем перейдите в подкаталог конкретного языка и скопируйте всеnib файлы из en.lproj в этот каталог.

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

Так что мойвопросы:

  • Это просто ошибка в симуляторе? Так что большое НЕТ этому
  • Кто-нибудь еще имел эту проблему? Да
  • Это результат какой-то неясной настройки XCode, которую я случайно переключил? Нет, не похоже на это

Обновление

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

Я попробовал предлагаемое McCygnus исправление (удалите все локализации для моих xibs, которые перемещают их обратно в корневой каталог), и это отсортировало его для меня.Так что я думаю, что система локализации проверяет текущий языковой каталог, а затем корень, он не вернется к вашему языку по умолчанию.

Ответы [ 4 ]

7 голосов
/ 13 мая 2011

У меня была эта проблема недавно, когда у меня была английская версия пера, но я не локализовал ее для других языков (MyNib был в en.lproj).Симулятор только искал MyNib в каталоге на другом языке (da.lproj, de.lproj и т. Д.) И не возвращался к английской версии, если не найден.Я исправил это, удалив английскую локализацию для пера.Это привело к тому, что он был в корне пакета приложения с другими ресурсами, а не в en.lproj.После этого все заработало отлично.

Меня это немного смутило, поскольку я думал, что система локализации проверила все языки в предпочтительном для пользователя порядке, причем английский язык обычно используется разработчиком в качестве перехватчика.Я не уверен, что это изменение поведения при загрузке или ошибка симулятора (я никогда не пробовал на устройстве).Я предполагаю, что это последнее, но я не знаю точно.Это напоминает мне о том, что мне нужно отправить отчет об ошибке.

4 голосов
/ 23 ноября 2011

, если вы используете

[[Class alloc] initWithNibName:@"aNibName" bundle:nil];  

, измените его на

[[Class alloc] initWithNibName:@"aNibName" bundle:[NSBundle mainBundle]];
2 голосов
/ 28 октября 2011

У меня был тот же симптом, но другая основная причина, которой я хотел бы поделиться. Я удалил локализацию, на что намекал Маккинн (спасибо за это), но все же получил то же исключение только на iPad. Оказалось, что мой файл Info.plist содержал ссылку на специфичный для iPad файл nib главного окна (MainWindow-iPad.nib). После удаления все заработало.

1 голос
/ 01 июня 2013

Мне удалось решить эту проблему, просто перезапустив xcode. = /

...