2013-08-23 4 views
1

몇 가지 UIBarButtonItems 및 UITextFields가 포함 된 UITableView가있는 UIToolbar가있는보기가 있습니다.TapGestureRecognizer에서 UIBarButtonItem 탭 무시 무시

아무 데나 탭이있는 텍스트 필드의 키보드를 닫으 려합니다. 따라서 TapGestureRecognizer를보기에 추가했습니다. TapgestureRecognizer가 UIBarButtonItems의 탭을 처리하는 것을 피하기 위해 다음 메소드를 추가했습니다 (델리게이트가 설정 됨).

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    UIView *view = touch.view; 
    while (view) { 
     NSLog(@"Class of view: %@", NSStringFromClass([view class])); 
     view = view.superview; 
    } 

    // Disallow recognition of tap gestures in the toolbar 
    if ([touch.view isKindOfClass:[UIToolbar class]]) { 
     return NO; 
    } 

    if ([touch.view.superview isMemberOfClass:[UIToolbar class]]) { 
     return NO; 
    } 

    return YES; 
} 

UIBarButtonItem은보기 자체가 아니지만 수퍼 뷰는 UIToolbar입니다. 위의 메서드를 사용할 때 isKindOfClass : [UIToolbar class]에 대한 검사가 툴바의 모든 탭에서 작동하지 않는 것 같습니다. 그러나 isMemberOfClass : [UIToolbar class]를 사용한 수퍼바이저에 대한 검사가 작동합니다.

나는 이것을 이해하지 못한다. 어쩌면 누군가가이 행동을 설명 할 수 있을까요?

답변

0

개인보기 클래스와 관련된보기 계층 구조에 의존해서는 안됩니다. 그것은 언제든지 바뀔 수 있습니다.

더 나은 방법은 제스처를 테이블보기 (또는 관심있는 영역을 나타내는 다른 적절한보기)에 추가하는 것입니다. 일반적인 테이블 작업을 차단하지 않도록 적절한 시간에 제스처를 활성화 및 비활성화하십시오.

+0

팁 주셔서 감사하지만 질문에 대답하지 않습니다. NSLog 문을 통해 UIToolbar가 탭 위치의 뷰 계층에 있음을 알 수 있습니다. 그러나 isKindOfClass [UIToolbar 클래스]는 NO를 반환합니다. 왜? – Leontien

+0

슈퍼 뷰 체인에서 툴바보기까지의 거리는 어느 정도입니까? – Wain

+0

터치의 superview입니다. view : Touch.view.superview – Leontien