Интерфейсный конструктор: выберите носитель на основе цели

В Xcode я использую цели для выпуска нескольких версий приложений, которые имеют общий базовый код и, как правило, имеют разную графику.

то есть. Притворяясь, что у меня есть цель JOHN и цель DOE. Я мог бы добавить в пакет разные изображения с именами точно example.png и настроить каждое из них соответственно. Код не нуждается в каких-либо изменениях таким образом.

UIImageView *image = [UIImageView alloc] initWithImage:[UIImage imageNamed:@"example.png"]];

Если бы вместо этого я назвал каждое изображение в соответствии с другой версией, я бы получил что-то похожее на это:

NSString *imageName;

#ifdef JOHN
imageName = @"johnExample.png";
#else
imageName = @"doeExample.png";
#endif
UIImageView *image = [UIImageView alloc] initWithImage:[UIImage imageNamed:imageName]];

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

Проблема в следующем:

Во время работы с файлами nibs, Interface Builder просто загружает example.png случайным образом. Поэтому, если я работаю над целью JOHN, меня раздражает, что IB только что решил загрузить example.png из цели DOE.

Есть ли способ для Interface Builder загружать медиафайлы на основе цели?


person pablasso    schedule 07.11.2010    source источник


Ответы (3)


Чтобы закрыть этот вопрос, ответ: нет.

По состоянию на январь 11 года вы не можете загружать медиафайлы на основе цели в Interface Builder, но вы можете использовать некоторые обходные пути, как указал Digital Robot и мое собственное описание в вопросе.

person pablasso    schedule 27.01.2011

почему бы не определить это в начале кода

#ifdef JOHN
#define APP @"john"
#elseif DOE
#define APP @"doe"
#endif

и затем, каждый раз, когда вы захотите использовать это, у вас может быть...

imagename = [NSString stringWithFormat:@"%@Example.png", APP];
person Duck    schedule 25.01.2011
comment
Я пытался избежать чего-то подобного, но все равно спасибо. - person pablasso; 25.01.2011

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

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

(Немного похоже на локализованные версии файлов.)

Таким образом, вы можете поместить изображение Джона как example.png в /project/john и изображение Доу как example.png в /project/doe. Вы должны дважды проверить, что правильные версии каждого образа включены в настройки сборки для каждой из целей соответственно. (Скопировать ресурсы Boundle) При этом «example.png» включается в Boundle только один раз. Случайная загрузка того или иного изображения больше не должна происходить, даже если вы называете его «example.jpg» в своем коде.

person Hermann Klecker    schedule 20.02.2013