Возможно ли иметь два xib-файла с одинаковым именем в одном проекте с Xcode? - PullRequest
3 голосов
/ 26 октября 2011

У меня есть проект для iPhone, для которого я создаю бесплатную / облегченную версию. Я создал вторую цель и сейчас пытаюсь разобраться с различными интерфейсами, которые будут у каждой цели. Почти все виды будут различаться между целями в том смысле, что они по крайней мере будут иметь adView вверху. Однако некоторые взгляды различаются, если смотреть по-разному.

Мне интересно, возможно ли создать две xibs с одинаковыми именами для каждого контроллера представления для загрузки. Lite XIB будет находиться в своем собственном каталоге, и я добавлю его только в комплект для цели Lite. Из-за наличия отдельных пакетов я бы подумал, что если бы правильный xib был в правильном пакете, мне не пришлось бы различать код, который я хотел бы загрузить.

Я пытаюсь сделать это с xcode 4.2, но xcode вылетает при попытке открыть второй xib с тем же именем.

Заранее спасибо за любую помощь.

Ответы [ 3 ]

5 голосов
/ 26 октября 2011

Лучший и более разумный способ сделать это - дать одному файлу XIB полное имя версии, а другому файлу XIB - облегченное имя.Например, «MyGreatAppView-Full.xib» и «MyGreatAppView-Lite.xib».

При программной реализации контроллера представления одним из параметров, которые вы можете передать, является имя XIB, которое вы хотите загрузить.

EG

MyGreatAppViewController * appVC;

#if LITEVERSION
appVC = [[MyGreatAppViewController alloc] initWithNibName: @"MyGreatAppView-Lite.xib" bundle: nil];
#else
appVC = [[MyGreatAppViewController alloc] initWithNibName: @"MyGreatAppView-Full.xib" bundle: nil];
#endif

Другая идея, которую вы имели в виду, чтобы все файлы с одинаковыми именами были одинаковыми, зависит от хранения файлов XIB в отдельных папках и от надежды, что XCode не запутается.XCode 3 был довольно хорош в этом.XCode 4, по крайней мере для меня, не самый стабильный зверь.

3 голосов
/ 26 октября 2011

Да, вы можете. Когда вы создаете новую цель, она создает новый каталог в папке вашего проекта, что позволяет легко иметь одинаковые имена файлов для нескольких файлов. Когда вы добавляете новый или старый файл интерфейса, фактически любой файл, XCode спрашивает вас, какую цель вы хотите добавить. Просто отметьте цель, куда вы хотите добавить. Вы можете вручную управлять файлами в Target / Build Phases / Bundle Resources

Я сделал несколько бесплатных версий, вот что я обычно делаю:

  1. Создание новой цели для бесплатной версии

  2. Удалить все добавленные файлы, кроме файла appname-info.plist.

  3. Добавление всех общих исходных файлов в целевые объекты / Фазы сборки / Ресурсы компиляции (можно перетаскивать из навигатора)

  4. Добавление всех общих других файлов (значков и т. Д.) К цели Целевые / этапы сборки / ресурсы комплекта (можно перетаскивать из навигатора)

  5. Добавить все необходимые рамки (можно перетаскивать из навигатора)

  6. Щелкните левой кнопкой мыши / Показать в Finder файлы интерфейса, которые я хочу изменить. Скопируйте файлы во вновь созданный каталог в проекте

  7. Перетащите скопированные файлы интерфейса из Finder в Xcode и поместите их во вновь созданную целевую группу. Снимите флажок «Копировать элементы в целевую группу», поскольку он уже существует. Убедитесь, что выбранная цель отмечена в «Добавить к целям»

Он также работает для всех остальных значков, изображений, видео и т. Д. Если вы избегаете жесткого кодирования имен, он работает как шарм. У меня есть проекты с 6 целями (3 полной версии, 3 бесплатных), которые используют один и тот же код, но разные файлы xib, icon и мультимедиа. Я обычно снимаю ограничения в зависимости от того, является ли приложение свободным / облегченным или нет, с помощью следующего кода (Mac, для iOS просто удалите строки настройки значка):

NSString *appName = [NSString stringWithString:[[[NSBundle mainBundle] infoDictionary]   objectForKey:@"CFBundleName"]];
if ([appName rangeOfString:@"Lite"].location != NSNotFound || [appName rangeOfString:@"lite"].location != NSNotFound) {
    //put lite badge on
    NSString *badgeText = @"lite";
    [[NSApp dockTile] setBadgeLabel:badgeText];
    fullVersion = NO;
} else if ([appName rangeOfString:@"Free"].location != NSNotFound || [appName rangeOfString:@"free"].location != NSNotFound) {
    //put free badge on
    NSString *badgeText = @"free";
    [[NSApp dockTile] setBadgeLabel:badgeText];
    fullVersion = NO;
} else {
    fullVersion = YES;
}
0 голосов
/ 26 октября 2011

Я не думаю, что вы можете использовать одно и то же имя для другого файла XIB. После того, как вы соберете приложение, вы обнаружите, что все xib-файлы скомпилированы в nibs и помещены в один и тот же каталог (в основном комплекте). Но вы можете использовать разные имена, и если-еще будет полезно.


если (liteVersion) { viewControll = [[YourViewController alloc] initWithNibName: @ "YourViewController-Lite.xib" bundle: nil]; } Еще { viewControll = [[YourViewController alloc] initWithNibName: @ "YourViewController.xib" bundle: nil]; }

...