2012-03-17 13 views
6

Próbowałem dowiedzieć się, dlaczego tak się dzieje, ale wygląda na to, że w wersji na iPada mojej uniwersalnej aplikacji ładuje się iPhone .xib zamiast iPada.Uniwersalna aplikacja na iPada nie ładuje plików .xib na iPada?

Nazwałam mój iPhone Xibs z przyrostkiem ~ iphone.xib i zostawiłam moje iPady tylko z .xib. Czytałem, żeby to zrobić, ponieważ ktoś powiedział, że pracował dla nich, ale w moim przypadku to nie działa dla mnie!

Nawet jeśli robię ~ ipad.xib i ~ iphone.xib dla różnych plików .xib, to nadal ładuje się wersja iPhone'a!

* * Czy jest jakiś sposób, aby całkowicie potwierdzić, że ładuje wersję iPhone zamiast wersji na iPada?

A czy jest jakiś sposób aby rozwiązać ten problem tak, że iPad ładuje .xibs iPadzie? **

dzięki!

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 

// Override point for customization after application launch. 
    self.viewController = [[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]] autorelease]; 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 
+0

To działa dla mnie ... Dziwne. Ale czy aplikacja jest naprawdę uniwersalna? Czy działa na "pełnym ekranie"? – fbernardo

+0

Tak, działa na pełnym ekranie. Rodziny urządzeń w ustawieniach projektu i ustawienia docelowe to "iPhone/iPad". Czy używasz dwóch różnych sufiksów lub w inny sposób używasz? –

+0

Sterownik ~ ipad.xib i kontroler ~ iphone.xib, a następnie w kodzie właśnie wywołuję [[Przypisanie kontrolera] initWithNibName: @ "Controller" bundle: nil]; – fbernardo

Odpowiedz

4

W mojej aplikacji, robię to w ten sposób. Tworzę oddzielne pliki .h, .m i XIB dla widoków iPada, a następnie w AppDelegate po prostu stawiam warunek if, który decyduje, który kontroler widoku będzie wyświetlał.
Btw. Nie używam tych sufiksów na XIB, nazywam ich tym, co chcę.

plik My AppDelegate.h (jego część)

@class FirstViewController; 
@class FirstIpadViewController;  
....... 
....... 
@property (nonatomic, retain) IBOutlet FirstViewController *viewController; 
@property (nonatomic, retain) IBOutlet FirstIpadViewController *ipadViewController; 

Mój plik AppDelegate.m (jego część)

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
} else { 
    self.window.rootViewController = self.ipadViewController; 
    [self.window makeKeyAndVisible]; 
} 

Powinno to na pewno to zrobić. Wystarczy zmienić klasę i właściwość w pliku .h, do kontrolera widoku i powinno być dobrze iść :)

EDIT

Właśnie dowiedziałem się, jak to zrobić. Odpowiednimi konwencjami nazewnictwa są _iPhone i iPad. Jest to zasadniczo takie samo, jak napisałem powyżej, tylko zmiana polega na tym, że będzie zawierał te same pliki .h i .m, ale różne XIB.

W AppDelegate .M złożyć

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
     self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil]; 
    } else { 
     self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil]; 
    } 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 
+0

Niestety używam jednej klasy dla obu xibs, więc w jaki sposób zrobić to obejście z tym? Również nie mam mainWindow.xib do podłączenia IBOutlets, po prostu podłączyć go programowo. –

+0

Ok, właśnie się dowiedziałem. Zaktualizowałem kod w odpowiedzi :) –

+0

Och, widzę! Więc nie jest to ~ iphone.xib i ~ ipad.xib, ale zamiast tego _iPhone.xib i _iPad.xib? –

0

Rozwiązanie współpracuje z storyboardy podczas korzystania swoje własne xibs. To ponowne wykorzystanie tych samych .h & .M plików dla widoków:

  • ViewController.h
  • ViewController.m
  • ViewController.xib
  • ViewController ~ iPad.xib

W Twój plik ViewController.m dodaj:

- (id)initWithCoder:(NSCoder *)aDecoder 
    { 
     if (self) 
     { 
      NSString* nibName = NSStringFromClass([self class]); 
      if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) 
      { 
       self = [super initWithNibName:nibName bundle:nil]; 
      } 
      else if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
      { 
       self = [super initWithNibName:[nibName stringByAppendingString:@"~iPad"] bundle:nil]; 
      } 
      return self; 
     } 
     return self; 
    } 

Wystarczy sprawdzić, czy w plikach Xib ustawiono nazwę niestandardowej nazwy kontrolera właściciela pliku i zestaw gniazd widoku.