#iphone #ios #xcode #xib
#iPhone #iOS #xcode #xib
Вопрос:
У меня есть проект iPhone, для которого я создаю бесплатную / облегченную версию. Я создал вторую цель, и на данный момент я пытаюсь разобраться с различными интерфейсами, которые будут иметь каждая цель. Почти все представления будут отличаться между целями в том смысле, что они, по крайней мере, будут иметь AdView вверху. Однако некоторые представления выглядят по-разному.
Мне интересно, возможно ли создать два xibs с одинаковым именем для каждого загружаемого контроллера представления. Lite xib отправится в свой собственный каталог, и я добавлю его только в пакет для цели lite. Из-за наличия отдельных пакетов я бы подумал, что если бы правильный xib был в правильном пакете, мне не пришлось бы различать в коде, какой xib я хотел бы загрузить.
Я пытаюсь сделать это с помощью xcode 4.2, но xcode вылетает, когда я пытаюсь открыть второй файл xib с тем же именем.
Заранее спасибо за любую помощь.
Ответ №1:
Лучшим и более разумным способом сделать это было бы присвоить одному файлу xib имя полной версии, а другому файлу xib — облегченное имя. Например, «MyGreatAppView-Full.xib» и «MyGreatAppView-Lite.xib».
При программном создании экземпляра контроллера представления одним из параметров, которые вы можете передать, является имя XIB, которое вы хотите загрузить.
Например,
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 с одинаковыми именами, зависит от хранения файлов xib в отдельных папках и надежды, что XCode не запутается. XCode 3 был довольно хорош в этом. XCode 4, по крайней мере для меня, не самый стабильный зверь.
Комментарии:
1. Другой способ сделать это (кроме
#if...#endif
директив препроцессора), в частности, если вы хотите включить разныеxib
s для разных целей в один и тот же проект, — создатьnibName
или аналогичный метод вMyGreatAppViewController
и сделать две копии.m
файла, каждый из которых возвращает правильноеNSString
имя файла xib для себя. Таким образом, вы можете убить двух зайцев одним выстрелом: другой интерфейс с другим (или одинаковым) поведением, и вам нужно беспокоиться только о том, чтобы установить правильную версию, препроцессор не определяет необходимости.
Ответ №2:
Да, вы можете. Когда вы создаете новую цель, она создает новый каталог в папке вашего проекта, что упрощает использование одинаковых имен файлов для нескольких файлов. Когда вы добавляете новый или старый файл интерфейса, фактически любой файл, Xcode спрашивает вас, какую цель вы хотите добавить. Просто проверьте цель, которую вы хотите добавить. Вы можете вручную управлять файлами на этапах назначения / сборки / объединения ресурсов
Я уже создал несколько бесплатных версий, это то, что я обычно делаю:
-
Создайте новую цель для бесплатной версии
-
Удалите все добавленные файлы, кроме файла appname-info.plist.
-
Добавьте все общие исходные файлы в целевые целевые / этапы сборки / ресурсы компиляции (можно перетаскивать из навигатора)
-
Добавьте все другие общие файлы (значки и т. Д.) К целевой цели / этапам сборки / ресурсам пакета (можно перетаскивать из навигатора)
-
Добавьте все необходимые фреймворки (можно перетаскивать из навигатора)
-
Щелкните левой кнопкой мыши / Показать в Finder на файлах интерфейса, которые я хочу изменить. Скопируйте файлы во вновь созданный каталог в проекте
-
Перетащите скопированные файлы интерфейса из Finder в Xcode и поместите их во вновь созданную целевую группу. Снимите флажок «Копировать элементы в целевую группу», поскольку он уже есть. Убедитесь, что желаемая цель отмечена в разделе «Добавить к целям»
Это также работает для всего остального: значков, изображений, видео и т. Д. Если вы избегаете жесткого кодирования имен, это работает как шарм. У меня есть проекты с 6 целями (3 полные версии, 3 бесплатные), которые используют один и тот же код, но разные файлы xib, значков и мультимедиа. Обычно я снимаю ограничения в зависимости от того, является ли приложение бесплатным / облегченным или нет, с помощью следующего кода (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;
}
Комментарии:
1. Вы правы. Я думаю, что Xcode был в каком-то перепутанном состоянии, потому что он выдавал мне предупреждение о сбое каждый раз, когда я пытался перетащить xib-файл с тем же именем, что и другой (даже если он находился в другом каталоге). После перезапуска xCode все работало отлично. Я смог настроить свою облегченную версию точно так, как сказал Тибидадо. Спасибо!
Ответ №3:
Я не думаю, что вы можете использовать одно и то же имя для разных файлов xib. После сборки приложения вы обнаружите, что все файлы xib скомпилированы в nibs и помещены в один каталог (в основном пакете). Но вы можете использовать разные имена, и if-else будет полезно.
if(LiteVersion){ viewControll = [[YourViewController alloc] initWithNibName: @YourViewController-Lite.xib» bundle: nil]; }else{ viewControll = [[YourViewController alloc] initWithNibName: @YourViewController.xib» bundle: nil]; }
Комментарии:
1. Вопрос заключается в том, чтобы иметь xibs с одинаковым именем в одном проекте Xcode, разные цели. Не в одном приложении.