2013-02-03 7 views
11

Mam uniwersalną aplikację, w której ładuję główny scenorys ręcznie w application:didFinishLaunchingWithOptions.Wybór różnych scenorysów w oparciu o typ urządzenia

Mam 2 storyboardy na iPhone'a i iPada, które mają przyrostki ~iPhone i ~iPad. Ja ładuje moje storyboard używając:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
self.initialViewController = [storyboard instantiateInitialViewController]; 

ten drukuje Unknown class ViewController in Interface Builder file. do konsoli, więc widocznie to nie ładuje poprawnego storyboard. Jednak kiedy używam [UIStoryboard storyboardWithName:@"MainStoryboard~iPhone" bundle:nil]; działa dobrze, ale oczywiście będzie działać tylko dla iPhone'a.

Czego mi brakuje? Jak mogę użyć sufiksów nazw, aby automatycznie wybrać prawidłowy scenorys?

+0

dlaczego nie przejdziesz do ustawień projektu i ustaw scenorium iphone w informacjach o rozmieszczeniu iPhone'a i scenariuszu na ipad w informacji o wdrażaniu iPada. używasz więcej niż jednego storyboardu na urządzenie? Chodzi mi o to, jaki jest twój cel w ręcznym ładowaniu scenorysów? – guenis

+0

Co próbuję zrobić, to ustawić IIViewDeckController jako kontroler widoku root, więc ładowanie storyboardu automatycznie nie pomaga. –

+0

Wygląda na to, że jest to błąd w niektórych wersjach (jest on uszkodzony w systemie iOS 6.1.2, ale działał wcześniej w tym samym projekcie). Według dokumentów firmy Apple przyrostek ~ iphone jest uniwersalny, powinien wpłynąć na wszystkie ładowanie zasobów (obrazy, pliki NIB - w moim poprzednim doświadczeniu, wszystko). Wygląda na to, że Storyboardy są zepsute i jakoś pomijają selektor. – Adam

Odpowiedz

12

Nie wiem o automatycznym wyborze scenorysów na podstawie sufiksu ich nazw plików. Można użyć userInterfaceIdiom aby wybrać dla iPad vs iPhone:

if ([[UIDevice currentDevice] userInterfaceIdiom] ==UIUserInterfaceIdiomPad) { 
    UIStoryboard *storyboard = 
    [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil]; 
} else { 
    [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; 
} 

Ale jeśli robisz to, aby rozpocząć się z SZCZEGÓLNE kontrolera widoku, wszystko co musisz zrobić, to przeciągnąć „start” strzałkę do preferowanego kontrolera widoku w storyboard

Lub - wybierz kontroler widok w serii ujęć, przejdź do instpector atrybuty i zaznaczyć isInitialViewController

+1

Myślałem, że storyboardy zostaną automatycznie wybrane zgodnie z sufiksami nazw plików, takimi jak pliki XIB i obrazy. Dzięki! –

+0

Możesz dodać kategorię do UIStoryboard, na przykład deviceStoryboardWithName: bundle :, która otoczyłaby ten kod, dołączając odpowiedni sufiks, a następnie wywołając storyboardWithName: bundle :. Ułatwiłoby to czytanie kodu i śledzenie go. – GilroyKilroy

+1

W pliku info.plist można ustawić oddzielne storyboardy dla iPhone'a i iPada. Oto surowe wyjście z kopalni: UIMainStoryboardFile główna UIMainStoryboardFile ~ ipad iPad Więc jest osobny klucz do ustawiania storyboard iPad. Odpowiednimi nazwami plików w mojej konfiguracji są Main.storyboard i iPad.storyboard. –

0

// w appdelegate klasie, podczas uruchamiania aplikacji wybrać określony story board.

- (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; 
} 
0

można nazwać storyboard jak ten

  • Main.storyboard (dla iPhone)
  • Main_iPad.storyboard (dla iPad)

i wybierz je jak tego

- (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]; 
} 
0

To jest er rzeczy można ustawić bezpośrednio w pliku info.plist. Nie potrzeba żadnych wysiłków programistycznych. Poszukaj właściwości o nazwie "Główna nazwa pliku zestawu scenariusza", która będzie domyślnie zawierała "Główną".

Możesz dodać inną właściwość o nazwie "Główna nazwa pliku zestawu scenariusza (iPad)", która zostanie następnie wykorzystana na iPada.

To właśnie surowe wyjście w plist wygląda następująco:

<key>UIMainStoryboardFile</key> 
<string>Main</string> 
<key>UIMainStoryboardFile~ipad</key> 
<string>iPad</string> 

AFAIK jest to również możliwe, aby po prostu dodać drugi storyboard nazwie Main ~ iPad.storyboard (jeśli klucz UIMainStoryboardFile jest ustawiony jako główny) . A to zostanie odebrane dla iPadów. Nie testowałem tego od jakiegoś czasu.