Путаница в отношении NSClassFromString / Проверка распознавателя жестов

Я пытаюсь использовать 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 вернет ноль, когда я запустил его на этом устройстве, но это не так. Утверждение верно, и код выполняется. (Интересное примечание, код вроде работает на предварительной версии 3.2.)

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

Спасибо!

* Это устройство, на котором я работаю:

http://f.cl.ly/items/2H3R243s1Q3W343f2N0w/version_stackOverflowPost.png

2 ответа

Решение

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

Особые замечания по использованию

Чтобы определить, доступен ли класс во время выполнения в данной версии 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

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

Другие вопросы по тегам