Путаница в отношении 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.