Выбор различных раскадровки на основе типа устройства
У меня есть универсальное приложение, в котором я загружаю основную раскадровку вручную в application:didFinishLaunchingWithOptions
.
У меня есть 2 раскадровки для iPhone и iPad, у которых есть суффиксы ~iPhone
и ~iPad
. Я загружаю свою раскадровку, используя:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
self.initialViewController = [storyboard instantiateInitialViewController];
Отпечатает Unknown class ViewController in Interface Builder file.
на консоли, поэтому, по-видимому, он не загружает правильную раскадровку. Однако, когда я использую [UIStoryboard storyboardWithName:@"MainStoryboard~iPhone" bundle:nil];
, он отлично работает, но, конечно, будет работать только для iPhone.
Что мне не хватает? Как я могу использовать суффиксы имени для автоматического выбора правильной раскадровки?
Ответы
Ответ 1
Мне не известно о автоматическом выборе раскадровки на основе суффикса имени файла. Вы можете использовать userInterfaceIdiom
для выбора iPad против iPhone:
if ([[UIDevice currentDevice] userInterfaceIdiom] ==UIUserInterfaceIdiomPad) {
UIStoryboard *storyboard =
[UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
} else {
[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
}
Но если вы делаете это для запуска с помощью контроллера вида view, все, что вам нужно сделать, это перетащить стрелку "start" на ваш предпочтительный контроллер представления в раскадровке
Или - выберите контроллер просмотра в раскадровке, перейдите к указателю атрибутов и отметьте isInitialViewController
Ответ 2
//В классе appdelegate при запуске приложения выберите определенную панель сообщений.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UIStoryboard *storyboard1;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
storyboard1 = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:[NSBundle mainBundle]];
}
else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
storyboard1 = [UIStoryboard storyboardWithName:@"Main_iPad" bundle:[NSBundle mainBundle]];
}
UIViewController *vc = [storyboard instantiateInitialViewController];
// Set root view controller and make windows visible
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
return YES;
}
Ответ 3
Вы можете назвать свой раскадровки следующим образом
- Main.storyboard(для iPhone)
- Main_iPad.storyboard(для iPad)
и выберите их следующим образом
- (UIStoryboard *)deviceStoryboardWithName:(NSString *)name bundle:(NSBundle *)bundle {
if (IS_IPAD) {
NSString *storyboardIpadName = [NSString stringWithFormat:@"%@_iPad", name];
NSString *path = [[NSBundle mainBundle] pathForResource:storyboardIpadName ofType:@"storyboardc"];
if (path.length > 0) {
return [UIStoryboard storyboardWithName:storyboardIpadName bundle:bundle];
}
}
return [UIStoryboard storyboardWithName:name bundle:bundle];
}
Ответ 4
Это еще одна вещь, которую вы можете установить непосредственно в файле info.plist. Нет необходимости в каких-либо усилиях по программированию. Найдите свойство с именем "Основное имя файла основной раскадровки", которое по умолчанию будет содержать "Main".
Вы можете добавить другое свойство с именем "Основное базовое имя основной раскадровки (iPad)", которое затем будет использоваться для iPad.
Вот что выглядит исходный вывод в plist:
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIMainStoryboardFile~ipad</key>
<string>iPad</string>
Afaik также можно просто добавить вторую раскадровку Main ~ iPad.storyboard(если ключ UIMainStoryboardFile установлен как Main). И это будет воспринято для iPads. Не тестировали это через некоторое время.