2010-06-16 13 views
20

Przekonwertowałem aplikację na telefon iPhone za pomocą kreatora takiego jak w XCode do uniwersalnej aplikacji.Dynamicznie ładuj stalówkę dla iPhone'a/iPada w kontrolerach widoku

Buduje w porządku, ale oczywiście wygląda śmieci bitowego w niektórych obszarach :)

muszę załadować wkładów zgodnie z którym urządzenie jest używane. Nie chcę tworzyć kontrolerów widoku przy użyciu initWithNib, ponieważ mam już kod do tworzenia kontrolerów z pewnymi danymi (initWithMyLovelyData), który nie ma nic wspólnego z ładowaniem nib.

Wiem, aby znaleźć urządzenie, którego używasz UI_USER_INTERFACE_IDIOM(), więc próbowałem przesłonić initWithNibName w rzeczywistych kontrolerach widoku, zakładając, że jakoś się nazywają wewnętrznie. Ale to nie działa, jak przypuszczam, nie jestem pewien składni.

Próbowałem

if(ipad..) self = [super initWithNibName:@"MyIpadNib" bundle:nibBundleOrNil]; 

i że robi praca:/

EDIT - Wiem, że mam masowo edytować ten, wykonany moje pytanie nieco bardziej szczegółowe po zrobieniu kilka badań - przeprosiny!

+0

btw, proszę nie lmgtfy. – Will

Odpowiedz

22

EDYCJA: @ Odpowiedź Adama poniżej jest poprawną odpowiedzią.

Aby określić, który wkład chcesz załadować, wykonaj następujące czynności i zgraj swoją metodę initWithMyLovelyData i użyj właściwości do ustawienia danych. Powinieneś być w stanie z łatwością przenieść cały kod init do metody ustawiania właściwości.

MyViewController *viewController; 

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    viewController = [[MyViewController alloc] initWithNibName:@"ipadNIB" bundle:nil]; 
} else { 
    viewController = [[MyViewController alloc] initWithNibName:@"iphoneNIB" bundle:nil]; 
} 

viewController.myLovelyData = someData; 
+0

Przepraszam za wykopanie starych (ale) wpisów, ale: to nie działa dla mnie. Jakieś pomysły? – Linuxmint

+0

@Linuxmint Jaki masz problem? – kubi

+0

http: // stackoverflow.com/questions/5306346/trouble-with-loading-a-separate-xib-for-ipad-or-iphone – Linuxmint

2

po prostu umieścić te dwie metody w klasie o nazwie IPadHelper i użyć metody addIPadSuffixWhenOnIPad warunkowo wybrać pomiędzy dwoma stalówki w zależności od platformy

+ (BOOL)isIPad{ 
    if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_3_2){ 
     if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){ 
      return YES; 
     } 
    } 
    return NO; 
} 

+ (NSString *)addIPadSuffixWhenOnIPad:(NSString *)resourceName{ 
    if([IPadHelper isIPad]){ 
     return [resourceName stringByAppendingString:@"-iPad"]; 
    } 
    else { 
     return resourceName; 
    } 
} 

zobacz tutaj h ttp://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html więcej wyjaśnienie pierwszy metoda ...

+0

Kompilator powiedział, że jest to niepoprawne, ponieważ metody klasy powinny zwracać obiekty (id). Jeśli uważasz, że lepiej będzie dodać to do pliku C. – rowwingman

2

Możesz zjeść swoje ciasto i je zjeść. Wystarczy dodać metodę, która otacza initWithNibName: pakiet: i dodaje swój parametr myLovelyData:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil myLovelyData:(id)data 
{ 
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) 
    { 
     // Custom initialization using myLovelyData 
     // 
    } 
    return self; 
} 
0

myślę, że będzie lepiej, aby utworzyć plik C.
FileHelper.h

#import <Foundation/Foundation.h> 
BOOL isIPad(); 
NSString *addIPadSuffixWhenOnIPad(NSString *resourceName); 

FileHelper.m

#import "FileHelper.h" 
BOOL isIPad() { 
    if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_3_2) { 
     if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
      return YES; 
     } 
    } 
    return NO; 
} 

NSString *addIPadSuffixWhenOnIPad(NSString *resourceName) { 
    if(isIPad()) { 
     return [resourceName stringByAppendingString:@"-iPad"]; 
    } 
    else { 
     return resourceName; 
    } 
} 
74

Faktycznie, Apple robi to wszystko automatycznie, po prostu wymienić swoje pliki NIB:

MyViewController~iphone.xib // iPhone 
MyViewController~ipad.xib // iPad 

i załadować kontroler widok z najmniejsza ilość kodu:

[[MyViewController alloc] initWithNibName:nil bundle:nil]; // Apple will take care of everything 
+2

jeśli używasz tej instrukcji: [MyViewController alloc] init]; w powyższym przykładzie, czy robi dokładnie to samo? lub czy robi coś nieco innego? – hokkuk

+0

Spodziewam się, że "init" nic nie robi. Jeśli chcesz załadować NIB, musisz wywołać initWithNib - lub ręcznie załadować NIB z pakietu – Adam

+2

[[MyViewController alloc] init] jest dokładnie taki sam jak [[MyViewController alloc] initWithNibName: nil nibBundle: nil] To jest wymieniony w pliku UIViewController.h: "Jeśli masz podklasę UIViewController, musisz wywołać super implementację tej metody , nawet jeśli nie używasz NIB. (Dla wygody domyślna metoda init zrobi to za Ciebie , i podaj zero dla obu tych argumentów metod.) " – jsd

Powiązane problemy