2012-03-20 2 views
0

외부 클래스 (뷰 컨트롤러에없는 메소드)에서 위, 아래, 왼쪽 또는 오른쪽 스 와이프 동작을 모니터링하려고합니다. 나는 외부 클래스와 속성을 사용하여 어느 방향으로 밀어 넣었는지 판단 할 수 있도록 설정했지만 이제는 스 와이프가 감지 될 때 뷰 컨트롤러 내부에서 메서드를 실행하려고합니다 (어떤 방향이 스 와이프되었는지를 받아 들일 것입니다. 이에 따라 행동하십시오).뷰 컨트롤러가 아닌 클래스의 제스처 모니터링

다른 클래스에서 스 와이프가 감지 될 때 한 클래스에서 메서드를 실행하는 방법을 확신 할 수 없습니다. 현재, 내 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

당신이 UIView에 정교한 동작 감지를하고있는 경우, UIViewController의 관점에서 그렇게 의미가있다. 이 기능을 캡슐화하려면 UIView 하위 클래스를 만들고 거기에 제스처 처리를 구현 한 다음 필요에 따라 해당 메시지를 컨트롤러 클래스에 다시 전달합니다.

후자가 주요 질문 인 것 같습니다. delegation pattern의 대표적인 사례입니다. 제스처 처리를 구현하기 위해 UIView 사용자 지정을 만드는 경우이를 FooView이라고하고 공식적인 프로토콜 FooViewDelegate을 만들어보기의 대리인에게 메시지를 처리 ​​할 수 ​​있습니다. 이 경우 대리자가 컨트롤러 클래스가됩니다. 프로토콜에 관한 Apple docs.

또는 UIViewController 하위 클래스에 제스처 감지를 구현할 수 있으며 위임에 대해 걱정할 필요가 없습니다. 요구 사항에 따라 다릅니다.

보기 컨트롤러가 SwipeDetector 클래스에 대한 참조를 유지하면 또 다른 대안으로 (언급 한 것) SwipeDetector 인스턴스의 속성을 볼 수 있습니다. KVO 작동하려면, 당신은 예를 들어, 당신의 SwipeDetector 클래스에 속성 접근을 사용할 필요가

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

self.swipeDirection = kDirectionKeyUp; 대신 ivars를 직접 설정하십시오.

관련 문제