UIGestureRecognizer в iOS 3.1.3? - PullRequest
       20

UIGestureRecognizer в iOS 3.1.3?

4 голосов
/ 26 февраля 2011

Я работаю над созданием существующего проекта iPhone / iPad, обратно совместимого с iPhoneOS 3.0.

Моим текущим тестовым устройством является iPod Touch с 3.1.3.

Следующий бит кода вызывает проблемы:

Class gestureRecognizer = NSClassFromString(@"UISwipeGestureRecognizer");

if (gestureRecognizer != nil)
{

    UISwipeGestureRecognizer * leftSwipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self 
                                                                                               action:@selector(didSwipeLeft:)];
    leftSwipeRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
    leftSwipeRecognizer.delegate = self;
    [self.view addGestureRecognizer:leftSwipeRecognizer];
    _leftSwipeRecognizer = leftSwipeRecognizer;
}

Согласно документации Apple, UIGestureRecognizer определяется начиная с iOS 3.2. Поэтому я ожидаю, что Class gestureReconizer будет nil в предыдущей версии ОС и что следующее, если будет пропущено. Однако это не пропускает. gestureRecognizer не nil, код внутри if начинает выполняться и падает на leftSwipeRecognizer.direction, потому что:

-[UISwipeGestureRecognizer setDirection:]: unrecognized selector sent to instance 0x1e5720

Эта ситуация довольно запутанная. Я думаю, я делаю все по книге. Я пытаюсь проверить, существует ли класс, прежде чем я его использую, однако класс, которого там быть не должно, присутствует, обманывает мой тест, не соответствует его ожидаемым спецификациям и вылетает.

Я мог бы, конечно, поставить несколько respondsToSelector проверок тут и там, чтобы обойти эту аварию, но это не будет элегантным способом сделать это.

Есть еще предложения?

1 Ответ

11 голосов
/ 26 февраля 2011

В соответствии со ссылкой на класс UIGestureRecognizer, в разделе "Особые замечания по использованию" вам действительно нужно выполнить дополнительную проверку responsedsToSelector после проверки, существует ли класс.

Это прямо из документации:

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