UIGestureRecognizer падает на <OS3.2

Этого и следовало ожидать, но я не могу найти среду выполнения, которая работает должным образом, поскольку кажется, что раньше это был частный API!!!!

На данный момент у меня и OS3.1.3 отвечает на селектор addGestureRecognizer!!!!

if ( [self.view respondsToSelector:@selector(addGestureRecognizer:)] ) {

        UIGestureRecognizer *recognizer;
        recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(morePress)];
        [self.view addGestureRecognizer:recognizer];
        recognizer.delegate = self;
        [recognizer release];


    }

3 ответа

Решение

Вы должны проверить версию системы явно:

NSString *currentSystemVersion = [[UIDevice currentDevice] systemVersion];
if([currentSystemVersion compare:@"3.2"] == NSOrderedAscending) {
    //add gesture recognizer
} else {
    // :(
}

UIGestureRecognizer не поддерживается до iOS 3.2. Даже если метод addGestureRecognizer: существует, это не значит, что это безопасно для использования.

Это был действительно приватный API, который не поддерживается в версиях до 3.2.

Док Apple говорит:

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

Explenation:

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

Проверьте полный текст здесь.

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