Монитор для жестов из класса, не являющегося контроллером - PullRequest
0 голосов
/ 20 марта 2012

Я хочу отслеживать жесты смахивания вверх, вниз, влево или вправо из внешнего класса (т. Е. С помощью методов, отсутствующих в моем контроллере представления).Мне удалось настроить это с помощью внешнего класса и свойств, чтобы судить, какое направление было передано, но теперь я хочу запустить метод внутри контроллера представления при обнаружении удара (который примет, какое направление было проведено, идействовать соответственно).

Я не уверен, как заставить метод в одном классе работать при обнаружении удара в другом.В настоящее время мой класс SwipeDetector настроен, как показано ниже, и я бы хотел, чтобы эти константы kDirectionKey передавались в метод класса контроллера представления и чтобы этот метод вызывался всякий раз, когда происходит свайп.Это то, что я должен использовать наблюдателей?Я никогда не использовал их раньше, кажется немного пугающим.

@synthesize up = _up;
@synthesize down = _down;
@synthesize left = _left;
@synthesize right = _right;

@synthesize swipedDirection = _swipedDirection;

- (void)recogniseDirectionSwipes
{
    _up = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(upSwipeDetected)];
    _down = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(downSwipeDetected)];
    _left = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(leftSwipeDetected)];
    _right = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(rightSwipeDetected)];

    _up.direction = UISwipeGestureRecognizerDirectionUp;
    _down.direction = UISwipeGestureRecognizerDirectionDown;
    _left.direction = UISwipeGestureRecognizerDirectionLeft;
    _right.direction = UISwipeGestureRecognizerDirectionRight;

}

- (void)upSwipeDetected
{
    NSLog(@"Direction swipe sniffed out, and that direction was up!");
    _swipedDirection = kDirectionKeyUp;
}

- (void)downSwipeDetected
{
    NSLog(@"Direction swipe sniffed out, and that direction was down!");
    _swipedDirection = kDirectionKeyDown;
}

- (void)leftSwipeDetected
{
    NSLog(@"Direction swipe sniffed out, and that direction was left!");
    _swipedDirection = kDirectionKeyLeft;
}

- (void)rightSwipeDetected
{
    NSLog(@"Direction swipe sniffed out, and that direction was right!");
    _swipedDirection = kDirectionKeyRight;
}

@end

1 Ответ

1 голос
/ 20 марта 2012

Если вы выполняете сложное обнаружение жестов на UIView, имеет смысл сделать это в представлении UIViewController.Чтобы инкапсулировать эту функциональность, вы должны создать подкласс UIView, реализовать там обработку жестов, а затем при необходимости передать соответствующие сообщения классу контроллера.

Последний вопрос, по-видимому, является вашим основным вопросом.Это классический случай для шаблона делегирования .Если вы решите создать пользовательский UIView для реализации обработки жестов, давайте назовем его FooView, тогда вы могли бы создать формальный протокол FooViewDelegate для обработки сообщений делегату представления.В этом случае делегатом будет ваш класс контроллера. Apple docs по протоколам.

Кроме того, вы можете просто реализовать обнаружение жестов в своем подклассе UIViewController, и вам не придется беспокоиться о делегировании.Это зависит от ваших требований.

В качестве другой альтернативы (на которую вы ссылаетесь), если контроллер представления сохраняет ссылку на класс SwipeDetector, вы можете наблюдать свойства в экземпляре SwipeDetector.

[self addObserver:self forKeyPath:@"swipeDetector.swipeDirection" 
          options:NSKeyValueObservingOptionNew 
          context:NULL];

Обратите внимание, что для работы KVO вам необходимо использовать средства доступа к свойствам в классе SwipeDetector, например, self.swipeDirection = kDirectionKeyUp; вместо прямой установки иваров.

...