Путаница в отношении NSClassFromString / Проверка на распознаватель жестов - PullRequest
3 голосов
/ 04 февраля 2012

Я пытаюсь использовать NSClassFromString, чтобы предотвратить запуск блока кода на устройствах с iOS 3.2. Кодовый блок, о котором идет речь, выглядит следующим образом:

if (NSClassFromString(@"UITapGestureRecognizer"))
{
    UITapGestureRecognizer *tap = [[[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(dismissKeyboard)] autorelease];
    [tap setCancelsTouchesInView:NO];
    [[self view] addGestureRecognizer:tap];
}

Я делаю это, потому что в документации Apple говорится, что UITapGestureRecognizer несовместим с установками до 3.2. https://developer.apple.com/library/ios/#documentation/uikit/reference/UITapGestureRecognizer_Class/Reference/Reference.html

Первоначально я думал, что использование NSClassFromString вернет nil, когда я запустил его на этом устройстве, но это не так. Утверждение верно, и код выполняется. (Интересное примечание, код вроде работает на установке, предшествующей 3.2.)

В любом случае, я хотел бы знать, почему NSClassFromString НЕ возвращает nil, и есть ли что-то, что я могу сделать иначе, чтобы выполнить то, что я пытаюсь сделать?

enter image description here

Ответы [ 2 ]

8 голосов
/ 04 февраля 2012

Из документов

Особенности использования

Чтобы определить, доступен ли класс во время выполнения в данной версии iOS, вы обычно проверяете, класс ноль. К сожалению, этот тест не совсем точен для UIGestureRecognizer. Хотя этот класс был общедоступным начиная с iOS 3.2, он был в разработке за короткий период до тот. Хотя класс существует в более раннем выпуске, его использование и другие классы распознавания жестов не поддерживаются в этом ранее релиз. Вы не должны пытаться использовать экземпляры этих классов.

Чтобы определить во время выполнения, можно ли использовать распознаватели жестов в ваше приложение, проверьте, существует ли класс, и, если это так, выделить экземпляр и посмотреть, отвечает ли он селектору locationInView :. Этот метод не был добавлен в класс до iOS 3.2. Код может выглядеть следующим образом:

UIGestureRecognizer *gestureRecognizer = [[UIGestureRecognizer alloc] initWithTarget:self action:@selector(myAction:)];

if (![gestureRecognizer respondsToSelector:@selector(locationInView:)]) {
    [gestureRecognizer release];
    gestureRecognizer = nil;
}
// do something else if gestureRecognizer is nil
2 голосов
/ 04 февраля 2012

Вероятно, происходит то, что UITapGestureRecognizer существует, но просто не доступен в 3.1.3. В прошлом мне повезло с проверкой UISplitViewController.

...