2016-07-04 4 views
0

UICollectionView에 사용자 지정 흐름 레이아웃이 있는데 이는 항목을 삭제할 수있는 가능성입니다. 색인을 검색하기 위해 함수를 사용합니다 :보낸 사람이 때때로 잘못된 값을 보냅니다.

-(void)aMethod:(UIButton*)sender{ 
    [self.viewModel deleteAt:[sender tag]]; 
    [self.myCollectionView reloadData]; 
} 

간혹 (드물게) 충돌이 발생했습니다. 나는 그걸 파헤쳐 보면, 때로는 [sender tag]이 정확하지 않다는 사실을 발견했다. 왜 그런 일이 일어 났습니까? 배열에 5 개의 항목 만 있었을 때 8 개를 보내는 것으로 나타났습니다.

버튼이 같이있는 UITableViewCell 위에 배치 간단한 40x40 너비/높이 이미지이다

UIButton *button = [UIButton new]; 
     [button setImage:[UIImage imageNamed:@"m_delete"] forState:UIControlStateNormal]; 
     if (self.shouldEdit){ 

      self.layout.longPressGestureRecognizer.minimumPressDuration = 0.3f; 
      NSLog(@"1 blk called"); 
     [button addTarget:self 
        action:@selector(aMethod:) 
     forControlEvents:UIControlEventTouchUpInside]; 
     [button setTag:indexPath.row]; 
     [cell addSubview:button]; 

     [button mas_makeConstraints:^(MASConstraintMaker *make) { 

      make.left.equalTo(cell.mas_left).with.offset(2); 
      make.top.equalTo(cell.mas_top).with.offset(2); 

     }]; 

     } 
+1

나는 당신이 당신 자신의 질문에 대답했다고 믿습니다. 말씀 드렸다시피 태그에 사용한 목적은 항목을 삭제하는 것이 었습니다. 그러나 태그를 변경하지 않으면 태그는 고정 된 상태로 유지됩니다. 따라서 색인이 0 - 7이고 색인이 0 - 7 인 8 개의 항목이 있다고 가정하면 목록의 첫 번째 항목이 삭제됩니다. 이제 색인이 0 - 6 인 7 개의 항목이 있습니다. 그러나 태그가 0 인 버튼을 삭제하고 나머지 버튼 태그는 여전히 1 - 7로 번호가 매겨집니다. 큰. 고정 인덱스 태그를 기반으로 삭제하지 마십시오. 컬렉션의 단추 인덱스를 기반으로 삭제하십시오. – christopherdrum

+0

@christopherdrum 잘, 그 경우에는 언제든지 충돌을 얻을 것이다,하지만 그것은 아주 드물게 발생합니다. 답변을 주셔서 감사합니다. –

+1

아니요, 매번 충돌하지 않습니다. 일을 삭제하는 순서에 따라 달라집니다. 역순으로 삭제할 경우, 맨 아래로, 그것은 전혀 충돌하지 않을 것입니다. – christopherdrum

답변

2

버튼의 태그를 업데이트하지 않고 오래된 셀을 재사용하고 있다고 의심됩니다. 조건이 있으니 [button setTag:indexPath.row];을 의미하는 if (self.shouldEdit)이 항상 호출되는 것은 아닙니다. 당신은 버튼의 목적은 항목을 삭제하는 것이므로 5 셀 중 하나로서 이전/삭제 된 셀 (태그 8이있는 셀)을 재사용하고 setTag를 호출하지 않는다고 언급했습니다.

조건부 바깥에서 setTag 행을 가져 와서 셀이 생성/재사용 될 때마다 버튼 태그를 항상 업데이트합니다.

또는 UITableViewCell의 prepareForReuse 또는 dequeueReusableCellWithReuseIdentifier(...) 바로 뒤의 cellForRowAtIndexPath에서 재사용하기 전에 이전 버튼이 셀에서 제거되었는지 확인할 수 있습니다. 이렇게하면 이전 버튼이 셀에서 제거되어 항상 새 버튼을 추가해야합니다.

0

버튼 태그 cellForRowAtIndexPath 너무 callled 그 방법에 설정된 태그 그나마마다 겹쳐있다 이 광고를 제거

[button setTag:indexPath.row]; 

사용이 하나의

-(void)aMethod:(UIButton*)sender 
{ 
    CGPoint point=[sender convertPoint:CGPointZero toView:collectiewname]; 
    NSIndexPath *indexPath=[collectiewname indexPathForItemAtPoint:point]; 
    NSLog(@"row :%ld",(long)indexPath.row) 


} 
+0

잠시만 기다려주십시오. –

+0

문제는 UIButtons를 만들고 ifEdit 조건이 거짓 (사용자가 오랫동안 버튼을 누르면 그 상태를 입력) 한 후에 삭제하는 것입니다. 따라서 단일 버튼 참조를 사용하여 제 경우에는 작동하지 않습니다. –

+0

ifEdit 조건이 false 인 경우 셀에 uibutton을 추가해야하므로 올바른 태그를 얻을 수 있으므로 매번 uibutton을 추가해야합니다. –

관련 문제