2016-07-04 5 views
0

UICollectionViewにはカスタムフローレイアウトがあり、その目的はアイテムを削除するための空き状況です。インデックスを取得するために関数を使用します。送信者が間違った値を送信することがあります

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

時には(まれに)クラッシュしました。私はそれを掘るとき、私は時々[sender tag]が間違っていた、実際には、アイテムの数の高さの配列が見つかりました。なぜそれが起こるのですか?私は配列が5つの項目しか持っていなかったときに8を送信することが分かった。

ボタンこのようUITableViewCellの上方に配置され、単純な40×40の幅/高さ画像である:

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の8つのアイテムがあり、したがってタグが0〜7であるとしましょう。次に、リストの最初のアイテムを削除します。今度はインデックスが0〜6の7つのアイテムがありますが、タグが0のボタンは削除され、残りのボタンタグは1〜7の番号が付けられています。大。 固定インデックスタグに基づいて削除しないでください。コレクション内のボタンのインデックスに基づいて削除します。 – christopherdrum

+0

@christopherdrumまあ、その場合、私は毎回クラッシュするだろうが、それは本当にまれに起こる。回答ありがとうございます。 –

+1

いいえ、毎回クラッシュすることはありません。それはあなたが物事を削除する順序に依存します。逆の順序で、下から上に削除すると、おそらく全くクラッシュしません。 – christopherdrum

答えて

2

ボタンのタグを更新せずに古いセルを再利用していると思われます。 [button setTag:indexPath.row];を意味するif (self.shouldEdit)という条件があるので、常に呼び出されるわけではありません。ボタンの目的はアイテムを削除することで、5つのセルの1つとして古い/削除されたセル(タグ8を持つもの)を再利用し、setTagを呼び出さないことがあると述べました。

セルの作成/再利用のたびに常にボタンのタグを更新するように、条件外でsetTag行を使用することができます。

また、UITableViewCellのprepareForReuseまたはdequeueReusableCellWithReuseIdentifier(...)の直後のcellForRowAtIndexPathで再利用する前に、古いボタンがセルから削除されていることを確認することもできます。これを行うには、古いものがセルから削除されているため、常に新しいボタンを追加する必要があります。

0

ボタンタグがcellForRowAtIndexPathそうcallledそのメソッドに設定タグをいけないたびに上書きされ この行を削除

[button setTag:indexPath.row]; 

使用この1

-(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を追加する必要があります。 –

関連する問題