IOS: Stop-Zellen, die fälschlicherweise wieder in UITableView
Habe ich eine grundlegende UITableView mit vier Abschnitten. Ich kontrolliere die Inhalte, die in jedem Abschnitt mit einer Switch-Anweisung.
Ich programmgesteuert erstellen Sie eine Schaltfläche, die angezeigt werden soll in die Zeilen der ersten DREI Abschnitte, aber NICHT in der vierten. Aber der button erscheint nach dem Zufallsprinzip in den vierten Abschnitt die Zeilen.
Ich nehme an, dies ist, weil eine Zelle wiederverwendet, aber wie erstelle ich jeden Abschnitt die Zeilen mit der Switch-Anweisung ist, kann ich nicht sehen wie dies geschieht. Irgendwelche Ideen geschätzt.
Ich bin mit einem benutzerdefinierten Zelle, die so konfiguriert ist:`
static NSString *CustomCellIdentifier = @"DashboardCell";
DashboardCell *cell = (DashboardCell *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier];
if (cell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DashboardCell"
owner:self options:nil];
for (id oneObject in nib) if ([oneObject isKindOfClass:[DashboardCell class]])
cell = (DashboardCell *)oneObject;
}
//Configure the cell.`
Den code zum erstellen dieser button ist: `
button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(200, 11, 50, 50);
UIImage *iConnect = [UIImage imageNamed:@"connect.png"];
[button setImage:iConnect forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonSelected:) forControlEvents:UIControlEventTouchUpInside];
[cell addSubview:button];`
Du musst angemeldet sein, um einen Kommentar abzugeben.
Benötigen Sie eine andere der Wiederverwendung Bezeichner für jede Art von Inhalt. Hier haben wir also zwei Arten der content - Zelle, die eine
UIButton
und Zellen, die nicht.Verwenden Sie die
indexPath
destableView:cellForRowAtIndexPath:
Methode zum auswählen eines reuse-identifier wird entweder " @"CellWithButton" oder @"CellWithoutButton".Was ist eigentlich passiert in deinem code ist, dass alle Zellen die gleiche reuse-identifier, was bedeutet, dass Sie alle in die gleiche Objekt-pool. Dies bedeutet, dass wenn Sie
[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier];
dass Sie das abrufen einer Zelle aus einem pool (potenziell enthält Zellen, die keinenUIButton
und Zellen, was zu tun). Daher die dequeue-Methode können zufällig Rückkehr eine Zelle, die bereits eineUIButton
Hinzugefügt. Wenn du zwei Wiederverwendung von Identifikatoren, dieUITableView
setup zwei Objekt-pools und korrekt hinterlegen und abrufen der entsprechenden Zellen von jedem.Oder Sie können eine Wiederverwendung pool und überprüfen Sie die Zelle für eine
UIButton
bei jedem Abruf einer mit der dequeue-Methode.In Ihrem DashboardCell, erstellen Sie eine Eigenschaft
@property (nonatomic, assign) BOOL buttonEnabled
. Dann in IhreawakeFromNib
, erstellen Sie immer die Schaltfläche und legen Siebutton.hidden = YES
. Überschreiben Sie die setter von Ihrer ImmobilieUnd schließlich überschreiben
prepareForReuse
Und jetzt können Sie enbale/deaktivieren Sie in Ihrer Konfiguration ein Teil der Methode cellForRowAtIndexPath
Können Sie zwei unterschiedliche cell-IDS je nach Abschnitt. Sonst würden Sie brauchen, um zu sehen, ob der button existiert in der Zelle, die zurückgegeben werden aus
dequeueReusableCellWithIdentifier:
und hinzufügen oder entfernen eine vorhandene, wenn nötig.Wenn Sie gehen, um die Wiederverwendung dieser Zellen und es gibt einige einfache Logik, die hinter-oder ausblenden jede Zelle die Taste das erste, was ich empfehlen würde, ist dass man den Knopf im Interface Builder und verbinden Sie es als eine Steckdose, um Ihre UITableViewDelegate.
Ich würde dann erstellen Sie eine setup-Methode für die Zelle, die Sie ausführen können, zu jeder Zeit, beliebig oft, ohne es zu zerbrechen:
Und in Ihre Zelle Unterklasse müssten Sie die Methode
-(void)setupWithSomeOptions:(SomeOptions)someOptions
, das wäre etwas entlang der Linien von: