Безопасно ли проверять UI_USER_INTERFACE_IDIOM(), чтобы определить, iPhone это или iPad?

Я нашел этот код здесь:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        str = [NSString stringWithString:@"Running as an iPad application"];
    } else {
        str = [NSString stringWithString:
                  @"Running as an iPhone/iPod touch application"];
    }

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Platform"
                                                    message:str
                                                   delegate:nil
                                          cancelButtonTitle:@"OK" 
                                          otherButtonTitles:nil];
    [alert show];
    [alert release];   

Насколько безопасна эта проверка? Apple действительно рекомендует это делать? Или может случиться так, что он не обнаружит iPad как iPad или iPhone как iPhone?


person openfrog    schedule 11.10.2010    source источник


Ответы (1)


Это должно быть достаточно безопасно, это хорошо-задокументировано Apple.

Это просто сокращение для следующего кода:

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
// etc

Вероятно, это может потерпеть неудачу, если вы попытаетесь запустить это на чем-то меньшем, чем iOS 3.2 (поскольку это было только представлено тогда), но это может не быть проблемой для вас.

person Sedate Alien    schedule 11.10.2010
comment
На самом деле это не дает сбоя при работе на более ранних ОС. В ОС до версии 3.2 выражение будет оцениваться как 0, что не равно значению UIUserInterfaceIdiomPad, равному 1, поэтому оно вернет правильный результат. - person Brad Larson; 11.10.2010
comment
Ваше утверждение неверно. UI_USER_INTERFACE_IDIOM() на самом деле определяется как ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone). Так что на iOS ‹ 3.2 он не подведёт, а ваш код будет - person user102008; 12.03.2011
comment
@Brad Larson: Представленный там код не будет работать с ОС до версии 3.2. Нет, выражение не равно 0, оно вызовет исключение, потому что селектор userInterfaceIdiom не распознается ненулевым объектом UIDevice. - person user102008; 12.03.2011
comment
@ user102008 - Я думаю, что что-то могло быть удалено из комментариев здесь, потому что мой комментарий был направлен на использование макроса UI_USER_INTERFACE_IDIOM(), а не точного кода в ответе. Вы правы, код, показанный в ответе выше, вызовет исключение в более старых версиях ОС, а макрос - нет. - person Brad Larson; 12.03.2011