Я обнаружил, что после нескольких дней успешного запуска и отладки локализованных приложений в 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, которые перемещают их обратно в корневой каталог), и это отсортировало его для меня.Так что я думаю, что система локализации проверяет текущий языковой каталог, а затем корень, он не вернется к вашему языку по умолчанию.