2012-04-12 8 views
2

Ich bin mir sicher, dass diese Frage nicht eindeutig ist, aber ich habe keine anderen Quellen gefunden, um sie zu lösen. Tatsächlich haben diese mehr Verwirrung verursacht. Bitte gib Licht, wenn du kannst.Verwechslung mit wiederverwendbaren Zellen (falsche Zellen nach dem Scrollen betroffen)

Der Kernpunkt des Problems ist, dass ich ein UILabel in eine Zelle einer 7-zeiligen 30-Zeilen-Tabelle mit benutzerdefinierten Zellen (-50) schieben möchte. Nach dem Scrollen verschieben ein paar andere Zeilen dieses Label und sie bewegen sich weiter und weiter, während das Scrollen fortgesetzt wird.

Sie werden feststellen, dass die minus 50 x -Koordinate an 2 Stellen zum Testen steht. Der erste in cell == nil wird nie aufgerufen. Warum?? Ich dachte, das wäre der Ort, um dieses Problem zu lösen.

Auch nicht sicher, wie initWithStyle (nicht für benutzerdefinierte) oder initWithCoder (im Storyboard erstellt) selbst wenn die Zelle Null war. ??

NSArray *a = [[userDetailData objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]]; 

    NSString *key = [[[a objectAtIndex:0] allKeys] objectAtIndex:0]; 
    NSString *value = [[a objectAtIndex:0] valueForKey:key]; 

    static NSString *CellIdentifier = @"MasterCell"; 

    UsersTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    // If cell does not exist, create it, otherwise customize existing cell for this row 
    if (cell == nil) { 
     // Create cell 
     cell = [[UsersTableViewCell alloc] initWithCoder:<#(NSCoder *)#>reuseIdentifier:CellIdentifier]; 

     // Configure cell: 
     NSLog(@"Key: %@ %d, %d", key, [indexPath section], [indexPath row]); 
     // Prepare the date field to move left for checkmark or ex-mark 

     if ([key isEqualToString:@"Date"]) { 
      CGRect frame = cell.comboLabel.frame; 
      frame.origin.x -= 50; 
      cell.comboLabel.frame = frame; 
      NSLog(@"In Date... minus 50"); 
     } 
    } 

    // Customize cell: 
    CGRect frame = cell.comboLabel.frame; 
    if ([key isEqualToString:@"Date"]) { 
     frame.origin.x -= 50; 
     cell.comboLabel.frame = frame; 
     NSLog(@" %d, %d\n cell: %@\n", [indexPath section], [indexPath row], cell); 
    } 
    else { 
     frame.origin.x += 0; 
     cell.comboLabel.frame = frame; 
    } 

    // Reset color 
    cell.comboLabel.textColor = [UIColor blackColor]; 

    // Set the Item 
    cell.nameLabel.text = [NSString stringWithFormat: @" %@",key]; 
    // Give the cell an accessory indicator 
    ..... continue on with logic. 

Antwort

1

Zelle ist nicht gleich Null, weil Sie es nur eine wiederverwendbare Zelle unmittelbar vor dem if-Anweisung zugeordnet.

I wie „Date Cell“ eine sekundäre Prototyp Zelle bildet, mit einer Kennung in Betracht ziehen würde und einen zweiten Satz von wieder verwendbaren Zellen machen, wenn die Zelle Sie erstellen Taste „Date“ hat

hier:

NSArray *a = [[userDetailData objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]]; 

NSString *key = [[[a objectAtIndex:0] allKeys] objectAtIndex:0]; 
NSString *value = [[a objectAtIndex:0] valueForKey:key]; 

static NSString *CellIdentifier = @"MasterCell"; 
static NSString *DateCellIdentifier = @"Date Cell"; 

UsersTableViewCell *cell; 

//Customize Cell 

if ([key isEqualToString:@"Date"]) { 

    cell = [tableView dequeueReusableCellWithIdentifier:DateCellIdentifier]; 
    CGRect frame = cell.comboLabel.frame; 

    frame.origin.x -= 50; 
    cell.comboLabel.frame = frame; 
    NSLog(@" %d, %d\n cell: %@\n", [indexPath section], [indexPath row], cell); 
} 
else { 
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    frame.origin.x += 0; 
    cell.comboLabel.frame = frame; 
} 

// Reset color 
cell.comboLabel.textColor = [UIColor blackColor]; 

// Set the Item 
cell.nameLabel.text = [NSString stringWithFormat: @" %@",key]; 
// Give the cell an accessory indicator 
..... continue on with logic. 

In der Tat, Sie werden wahrscheinlich nicht einmal die meisten Anpassung der Zelle tun müssen, wenn Sie nur Ihre Prototypzelle auf dem Storyboard anpassen.

+0

OK. Ich sehe die Idee, die du präsentierst. Deshalb können wir mehrere "Prototyp-Zellen" im Storyboard haben ?? – David

+0

Ja, das ist es, wofür ich sie verwende, wenn ich eine Tabelle mit ein paar verschiedenen Arten von Daten habe, die ich präsentieren möchte. Ich erstelle für jeden Datentyp einen anderen Prototyp und sortiere ihn entsprechend in der Funktion cellForRowAtIndexPath. –

+0

Ehrfürchtig. Das funktioniert. Keine treibenden UILabels mehr. Vielen Dank! – David

Verwandte Themen