Frage

Diese Frage bereits eine Antwort hier:

Gibt es eine API für die Überprüfung zur Laufzeit, ob Sie auf einem iPhone oder einem iPad?

laufen

Eine Möglichkeit, die ich denken kann wäre zu verwenden:

[[UIDevice currentDevice] model];

Und erkennt die Existenz des String @ "iPad." - was ein wenig zerbrechlich scheint

In der 3.2 SDK, sehe ich, dass UIDevice eine Eigenschaft hat, die wirklich das, was ich suche, aber nicht funktioniert für Pre-3.2 (natürlich):

[[UIDevice currentDevice] userInterfaceIdiom]; 

Gibt es andere Möglichkeiten als die Überprüfung für die Existenz von @ „iPad“ für einen Universal-App?

War es hilfreich?

Lösung

Zur Kasse UI_USER_INTERFACE_IDIOM .

Gibt die Schnittstelle Idiom von der aktuellen Gerät unterstützt wird.

Rückgabewert
UIUserInterfaceIdiomPhone, wenn das Gerät ein iPhone oder iPod touch oder UIUserInterfaceIdiomPad, wenn das Gerät ein iPad ist.

Andere Tipps

Nur für meinen Hinweis:

@property (nonatomic, readonly) BOOL isPhone;

-(BOOL)isPhone {
    return (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone);
}

oder Verwendung eines #define

#define IS_PHONE  (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone)

Wenn Sie jedoch isPhone ganzen Code verwenden, das ist im Allgemeinen schlechte Praxis. Verwenden Sie das Factory-Pattern und Polymorphismus zu halten Ihre if Aussagen enthalten, so dass Sie Objekte für Telefon oder für iPad erstellt und dann die Arbeit mit diesen.

hinzugefügt

Ich bin mit dieser Lösung alle jetzt meinen Code über. Es fügt ein Standard-Fabrik-Muster in die alloc.

#define ALLOC_PER_DEVICE()  id retVal = nil; \
                        NSString *className = NSStringFromClass(self);\
                        if (IS_PHONE && ![className hasSuffix:@"Phone"]) {\
                            className = [NSString stringWithFormat:@"%@Phone", className];\
                            Class newClass = NSClassFromString(className);\
                            retVal = [newClass alloc];\
                        }\
                        if (!retVal)\
                            retVal = [super alloc];\
                        assert(retVal != nil);\
                        return retVal\

Dann schauen meine Allocs wie folgt aus:

+alloc { ALLOC_PER_DEVICE(); }

Und ich hinzufügen, eine Unterklasse TheClassPhone für die Handy-Version genannt.

Hinweis: Da gibt es keine Mehrfachvererbung in Objective-C, Vererbung, Ihre Probleme zu lösen, ist ein bisschen überschätzt (das heißt, es funktioniert nicht, wenn Sie Subklassen von Subklassen haben). Nichts wie eine gute if, wenn Sie es brauchen.

  1. Überprüfen Sie das Vorhandensein der userInterfaceIdiom Eigenschaft, usings respondsToSelector :. Wenn es nicht vorhanden ist, sind wir auf einem Pre-3.2-Gerät, also nicht ein iPad.
  2. Wenn userInterfaceIdiom vorhanden ist, verwenden Sie es.

Edit: ... was natürlich genau das, was die UI_USER_INTERFACE_IDIOM () Makro tut, so verwendet, dass statt. :)

Sie können überprüfen, ob Sie die App auf Ihrem iPhone oder iPad laufen, indem Sie den folgenden Code:

- (NSString *)deviceModel
{
    struct utsname systemInfo;
    uname(&systemInfo);
    return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}

- (NSString *) platformString
{
    NSString *platform = [self deviceModel];
    if ([platform isEqualToString:@"iPhone1,1"])    return @"iPhone_2G";
    else if ([platform isEqualToString:@"iPhone1,2"])    return @"iPhone_3G";
    else if ([platform isEqualToString:@"iPhone2,1"])    return @"iPhone_3GS";
    else if ([platform isEqualToString:@"iPhone3,1"])    return @"iPhone_4";
    else if ([platform isEqualToString:@"iPhone3,3"])    return @"Verizon_iPhone_4";
    else if ([platform isEqualToString:@"iPhone4,1"])    return @"iPhone_4S";
    else if ([platform isEqualToString:@"iPhone5,1"])    return @"iPhone_5";
    else if ([platform isEqualToString:@"iPhone5,2"])    return @"iPhone_5";
    else if ([platform isEqualToString:@"iPod1,1"])      return @"iPod_Touch 1G";
    else if ([platform isEqualToString:@"iPod2,1"])      return @"iPod_Touch 2G";
    else if ([platform isEqualToString:@"iPod3,1"])      return @"iPod_Touch 3G";
    else if ([platform isEqualToString:@"iPod4,1"])      return @"iPod_Touch 4G";
    else if ([platform isEqualToString:@"iPad1,1"])           return @"iPad_1G";
    else if ([platform isEqualToString:@"iPad2,1"])      return @"iPad_2(WiFi)";
    else if ([platform isEqualToString:@"iPad2,2"])      return @"iPad_2(GSM)";
    else if ([platform isEqualToString:@"iPad2,3"])      return @"iPad_2(CDMA)";
    else if ([platform isEqualToString:@"iPad3,1"])      return @"iPad_3";
    else if ([platform isEqualToString:@"iPad3,2"])      return @"iPad_3(GSM/CDMA)";
    else if ([platform isEqualToString:@"iPad3,3"])      return @"iPad_3(GSM)";
    else if ([platform isEqualToString:@"iPad3,4"])      return @"iPad_3(GSM)";
    else if ([platform isEqualToString:@"iPad2,5"])      return @"iPad_mini_1G";
    else if ([platform isEqualToString:@"i386"])         return @"Simulator";
    else if ([platform isEqualToString:@"x86_64"])       return @"Simulator";
    return platform;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top