2016-07-04 8 views
0

Ich habe UICollectionView mit benutzerdefinierten Flow-Layout, welcher Zweck ist, Elemente zu löschen. Um Index zu erhalten benutze ich Funktion:Absender manchmal senden falschen Wert

Manchmal (in seltenen Fällen) habe ich crash. Als ich mich damit beschäftigte, fand ich manchmal, dass [sender tag] falsch war, tatsächlich höher als die Anzahl der Elemente. Warum ist das passiert? Ich habe festgestellt, dass es 8 sendet, wenn Array nur 5 Elemente hatte.

Knopf einfach 40x40 Breite/Höhe-Bild ist, oberhalb UITableViewCell wie es angebracht:

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

Ich glaube, Sie haben Ihre eigene Frage beantwortet. Wie Sie bereits sagten, bestand der Zweck, den Sie für das Tag verwendet haben, darin, Elemente zu löschen. Ein Tag bleibt jedoch statisch, es sei denn, Sie ändern es. Nehmen wir also an, Sie hätten 8 Elemente mit dem Index 0 - 7 und daher die Tags 0 - 7. Dann löschen Sie das erste Element in der Liste. Jetzt hast du 7 Items, mit den Indizes 0 - 6. ABER du hast die Taste mit dem Tag 0 gelöscht, und die restlichen Button-Tags sind noch mit 1 - 7 nummeriert. Ein Tag von 7 mit deinem neuen, kleineren Array von 6 Items ist auch groß. Löschen Sie nicht basierend auf einem festen Index-Tag. Löschen basiert auf dem Index der Schaltfläche in der Sammlung. – christopherdrum

+0

@christopherdrum gut, in diesem Fall werde ich jedes Mal abstürzen, aber es passiert in wirklich seltenen Fällen. Danke für die Antwort aber –

+1

Nein, Sie werden nicht jedes Mal einen Absturz bekommen. Das hängt von der Reihenfolge ab, in der Sie die Dinge löschen. Wenn Sie in umgekehrter Reihenfolge von unten nach oben löschen, wird es wahrscheinlich überhaupt nicht abstürzen. – christopherdrum

Antwort

2

Ich vermute, dass alte Zellen wieder verwendet werden, ohne das Tag der Schaltfläche zu aktualisieren. Da Sie die Bedingungen if (self.shouldEdit) haben, bedeutet dies, dass die [button setTag:indexPath.row]; nicht immer aufgerufen wird. Sie haben erwähnt, dass der Zweck der Schaltflächen darin besteht, Elemente zu löschen, so dass tableView die alte/gelöschte Zelle (die mit Tag 8) als eine der 5 Zellen erneut verwendet und nicht die setTag

Sie anruft kann die setTag-Zeile außerhalb der Bedingung verwenden, so dass sie das Tag der Schaltfläche jedes Mal aktualisiert, wenn die Zelle erstellt/wiederverwendet wird.

Alternativ können Sie sicherstellen, dass die alte Schaltfläche aus der Zelle entfernt wird, bevor sie in UITableViewCells prepareForReuse oder innerhalb cellForRowAtIndexPath direkt nach dequeueReusableCellWithReuseIdentifier(...) wiederverwendet wird. Dazu müssen Sie immer neue Schaltfläche hinzufügen, weil die alten aus der Zelle entfernt werden

0

Ohrenmarken werden jedesmal dann überschreiben, wenn cellForRowAtIndexPath nicht in dieser Methode callled so eingestellt tag entfernen diese Zeile

[button setTag:indexPath.row]; 

Verwendung dieses

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


} 
+0

in einem Moment bitte. –

+0

Problem ist, ich erstelle UIButtons und lösche es nach ifEdit Bedingung ist falsch (Benutzer geben diese Bedingung, wenn er lange drücken). Daher ist die Verwendung einer einzelnen Schaltfläche Referenz in meinem Fall nicht funktionieren. –

+0

Sie müssen Uibutton in Zelle hinzufügen, wenn ifEdit Bedingung falsch ist, so dass Sie richtige Tag erhalten können, bedeutet, dass Sie jedes Mal uibutton hinzufügen müssen –

Verwandte Themen