내 제스처 인식기가 잘못된보기에 연결되었습니다.

블레이크 헤어

화면 주위로 끌어서 놓을 수있는 요소가있는 UICollectionView가 있습니다. UILongPressGestureRecognizer를 사용하여 드래그를 처리합니다. 이 인식기를 내 collectionView:cellForItemAtIndexPath:메서드 의 컬렉션 뷰 셀에 연결합니다 . 그러나, 인식의 뷰 속성은 때때로 반환 UIView대신의 UICollectionViewCell. UICollectionViewCell에만있는 일부 메서드 / 속성이 필요하며 대신 UIView가 반환 될 때 내 앱이 충돌합니다.

셀에 연결된 인식기가 일반 UIView를 반환하는 이유는 무엇입니까?

인식기 부착

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{
    EXSupplyCollectionViewCell *cell = (EXSupplyCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
    UILongPressGestureRecognizer *longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:cell action:nil];
    longPressRecognizer.delegate = self;
    [cell addGestureRecognizer:longPressRecognizer];
    return cell;
}

제스처 처리

저는 switch 문과 함께 메서드를 사용하여 길게 누름의 여러 상태를 전달합니다.

- (void)longGestureAction:(UILongPressGestureRecognizer *)gesture {
    UICollectionViewCell *cell = (UICollectionViewCell *)[gesture view];
    switch ([gesture state]) {
        case UIGestureRecognizerStateBegan:
            [self longGestureActionBeganOn:cell withGesture:gesture];
            break;
        //snip
        default:
            break;
    }
}

longGestureActionBeganOn:withGesture경우라고 cell실제로 UICollectionViewCell완벽하게 동작이 실행의 나머지 부분은. 그렇지 않은 경우 셀이 될 인덱스 경로를 결정하려고 할 때 중단됩니다.

첫 번째 중단 발생

- (void)longGestureActionBeganOn:(UICollectionViewCell *)cell withGesture:(UILongPressGestureRecognizer *)gesture
{
    NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell]; // unrecognized selector is sent to the cell here if it is a UIView
    [self.collectionView setScrollEnabled:NO];
    if (indexPath != nil) {
        // snip
    }
}

또한 제스처의 다른 상태에 대해 UICollectionViewCell과 관련된 다른 속성을 사용합니다. 인식기가 내가 할당 한보기를 항상 돌려 주도록 보장 할 수있는 방법이 있습니까?

마티아스 바우 흐

UICollectionView 및 UITableView와 같은 뷰는 셀을 재사용합니다. 맹목적으로 gestureRecognizer를 collectionView:cellForItemAtIndexPath:추가하면 셀이 다시로드 될 때마다 새 인식 자를 추가합니다. 약간 스크롤하면 각 셀에 수십 개의 gestureRecognizer가 표시됩니다.

이론적으로 이것은 gestureRecognizer의 동작이 여러 번 호출된다는 것 외에는 어떤 문제도 일으키지 않아야합니다. 그러나 Apple은 셀 재사용에 대해 강력한 성능 최적화를 사용하므로 무언가가 엉망이 될 수 있습니다.

문제를 해결하는 가장 좋은 방법은 대신에 gestureRecognizer를 collectionView추가하는 것입니다.

또 다른 방법은 셀에 gestureRecognizer가 이미 있는지 확인하고없는 경우에만 새 인식자를 추가하는 것입니다. 또는 찾은 솔루션을 사용 prepareForReuse하고 셀 에서 gestureRecognizer를 제거합니다 . 후자의 방법을 사용할 때 올바른 방법을 제거 (또는 테스트)했는지 확인해야합니다. 시스템에서 추가 한 gestureRecognizers를 제거하고 싶지 않습니다. (iOS가 현재 이것을 사용하고 있는지 확실하지 않지만 향후 앱을 증명하려면이 모범 사례를 고수하는 것이 좋습니다.)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

PHP : 동적 데이터를 내보내는 동안 foreach ()에 잘못된 인수가 제공 되었습니까?

분류에서Dev

내 다중 기준 검색에서 잘못된 정보를 가져 오는 인덱스 일치

분류에서Dev

내 제스처 인식기가 신속하게 거꾸로 작동합니다.

분류에서Dev

내 호스텔에 보안되지 않은 Wi-Fi 연결이 연결되었지만 연결되면 "미확인 네트워크에 인터넷 액세스가 없습니다"라고 표시됩니다.

분류에서Dev

앱 내부에서 SMS를 보내는 iOS7의 모달보기가 잘못 정렬되었습니다.

분류에서Dev

인식 할 수없는 선택기가 UITableView 내의 인스턴스로 전송되었습니다.

분류에서Dev

foreach () "잘못된 인수"에 잘못된 인수가 제공되었습니다.

분류에서Dev

in laravel 오류 foreach ()에 대해 잘못된 인수가 제공되었습니다. (보기 : $ value를 볼 수 없습니다.

분류에서Dev

새로운 MoBo, 내부 스피커가 끊어 졌거나 잘못 연결 되었습니까?

분류에서Dev

값이 val 인 정수 연결 목록에서 모든 요소를 제거합니다. 내 코드가 잘못되었습니다. 이유를 모르겠습니다.

분류에서Dev

보조 인덱스-ValidationException : 제공된 시작 키가 잘못되었습니다.

분류에서Dev

숨겨진 'lat'및 'lng'필드가 제거되지 않았으므로 내 스크립트는 여전히 잘못된 위치 정보에서 위도 및 경도 결과를 검색하고있었습니다.

분류에서Dev

foreach ()에 대해 잘못된 잘못된 인수가 제공되었습니다.

분류에서Dev

정렬 된 연결 목록 구현에 관한 내 논리가 잘못 되었습니까?

분류에서Dev

내 onload 함수 시퀀스가 잘못되었습니다.

분류에서Dev

내 코드에서이 비정상적인 오류가 발생합니다. foreach ()에 대해 잘못된 인수가 제공되었습니다.

분류에서Dev

내 iOS 앱은 IPv6에서 잘 작동했지만 XMPP에 연결하는 것은 잘못되었습니다. Android에는 오류가 없습니다.

분류에서Dev

연결 실패 : 기본 호스트가 종료되었습니다.

분류에서Dev

kvm 게스트에 대한 인터넷 연결이 없습니다. 무엇이 잘못 되었을까요?

분류에서Dev

동일한 열 내에서 필터링 된 값을 할당 한 결과가 잘못되었습니다.

분류에서Dev

내 조각이 기본 활동 클래스에 연결되지 않습니다.

분류에서Dev

내 메일 서버에 대한 역방향 DNS가 (겉보기에) 잘못된 정보를 반환합니다.

분류에서Dev

swift3의 UITextfield 하위 클래스 내부 프레임 크기가 잘못되었습니다.

분류에서Dev

ssh를 통해 연결되었을 때 내 라즈베리 파이를 통해 인터넷에 액세스 할 수 없습니다.

분류에서Dev

잘못된 상태 :`when ()`내에서 Mock 메서드가 호출되지 않았습니다. 실제 메서드가 호출 되었습니까?

분류에서Dev

버스 연결을 가져 오지 못했습니다 : 연결할 수 없습니다 : 연결이 거부되었습니다.

분류에서Dev

Django 보내는 이메일 : 연결이 예기치 않게 종료되었습니다.

분류에서Dev

foreach () 다중 배열에 잘못된 인수가 제공되었습니다.

분류에서Dev

Azure 함수 V2의 메시지 연기 : 제공된 잠금이 잘못되었습니다.

Related 관련 기사

  1. 1

    PHP : 동적 데이터를 내보내는 동안 foreach ()에 잘못된 인수가 제공 되었습니까?

  2. 2

    내 다중 기준 검색에서 잘못된 정보를 가져 오는 인덱스 일치

  3. 3

    내 제스처 인식기가 신속하게 거꾸로 작동합니다.

  4. 4

    내 호스텔에 보안되지 않은 Wi-Fi 연결이 연결되었지만 연결되면 "미확인 네트워크에 인터넷 액세스가 없습니다"라고 표시됩니다.

  5. 5

    앱 내부에서 SMS를 보내는 iOS7의 모달보기가 잘못 정렬되었습니다.

  6. 6

    인식 할 수없는 선택기가 UITableView 내의 인스턴스로 전송되었습니다.

  7. 7

    foreach () "잘못된 인수"에 잘못된 인수가 제공되었습니다.

  8. 8

    in laravel 오류 foreach ()에 대해 잘못된 인수가 제공되었습니다. (보기 : $ value를 볼 수 없습니다.

  9. 9

    새로운 MoBo, 내부 스피커가 끊어 졌거나 잘못 연결 되었습니까?

  10. 10

    값이 val 인 정수 연결 목록에서 모든 요소를 제거합니다. 내 코드가 잘못되었습니다. 이유를 모르겠습니다.

  11. 11

    보조 인덱스-ValidationException : 제공된 시작 키가 잘못되었습니다.

  12. 12

    숨겨진 'lat'및 'lng'필드가 제거되지 않았으므로 내 스크립트는 여전히 잘못된 위치 정보에서 위도 및 경도 결과를 검색하고있었습니다.

  13. 13

    foreach ()에 대해 잘못된 잘못된 인수가 제공되었습니다.

  14. 14

    정렬 된 연결 목록 구현에 관한 내 논리가 잘못 되었습니까?

  15. 15

    내 onload 함수 시퀀스가 잘못되었습니다.

  16. 16

    내 코드에서이 비정상적인 오류가 발생합니다. foreach ()에 대해 잘못된 인수가 제공되었습니다.

  17. 17

    내 iOS 앱은 IPv6에서 잘 작동했지만 XMPP에 연결하는 것은 잘못되었습니다. Android에는 오류가 없습니다.

  18. 18

    연결 실패 : 기본 호스트가 종료되었습니다.

  19. 19

    kvm 게스트에 대한 인터넷 연결이 없습니다. 무엇이 잘못 되었을까요?

  20. 20

    동일한 열 내에서 필터링 된 값을 할당 한 결과가 잘못되었습니다.

  21. 21

    내 조각이 기본 활동 클래스에 연결되지 않습니다.

  22. 22

    내 메일 서버에 대한 역방향 DNS가 (겉보기에) 잘못된 정보를 반환합니다.

  23. 23

    swift3의 UITextfield 하위 클래스 내부 프레임 크기가 잘못되었습니다.

  24. 24

    ssh를 통해 연결되었을 때 내 라즈베리 파이를 통해 인터넷에 액세스 할 수 없습니다.

  25. 25

    잘못된 상태 :`when ()`내에서 Mock 메서드가 호출되지 않았습니다. 실제 메서드가 호출 되었습니까?

  26. 26

    버스 연결을 가져 오지 못했습니다 : 연결할 수 없습니다 : 연결이 거부되었습니다.

  27. 27

    Django 보내는 이메일 : 연결이 예기치 않게 종료되었습니다.

  28. 28

    foreach () 다중 배열에 잘못된 인수가 제공되었습니다.

  29. 29

    Azure 함수 V2의 메시지 연기 : 제공된 잠금이 잘못되었습니다.

뜨겁다태그

보관