Подтвердить что ты не робот

Выбор различных раскадровки на основе типа устройства

У меня есть универсальное приложение, в котором я загружаю основную раскадровку вручную в 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.

Что мне не хватает? Как я могу использовать суффиксы имени для автоматического выбора правильной раскадровки?

4b9b3361

Ответ 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. Не тестировали это через некоторое время.