2009-09-10 11 views
52

nel mio UITableView voglio impostare per le prime notizie di un feed rss un tableViewCell personalizzato (tipo A diciamo) e per le altre notizie secondo, terzo ecc. Un altro tableViewCell personalizzato (Tryp B) il problema è che il custom tableViewCell (trype A) creato per le prime notizie viene riutilizzato, ma curiosamente il numero di righe tra il primo uso di customViewCell (tipo A) e il secondo aspetto dello stesso tipo di customViewCell è non uguale ..2 diversi tipi di UITableViewCells personalizzati in UITableView

my cellForRowAtIndexPath sembra così.

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

    int feedIndex = [indexPath indexAtPosition:[indexPath length] - 1]; 
    Feed *item = [[[[self selectedButton] category] feedsList] objectAtIndex:feedIndex + 1]; 
    static NSString *CellIdentifier = @"Cell"; 

    if(feedIndex == 0){ 
     MainArticleTableViewCell *cell = (MainArticleTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

     if (cell == nil) 
     { 
      cell = [[[MainArticleTableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
      [[[cell subviews] objectAtIndex:0] setTag:111]; 
     } 

     cell.feed = item; 

     return cell; 

    } 
    else{ 
     NewsTableViewCell *cell = (NewsTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

     if (cell == nil) 
     { 
      cell = [[[NewsTableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier orientation:currentOrientation] autorelease]; 
      [[[cell subviews] objectAtIndex:0] setTag:111]; 
     } 

     cell.feed = item; 

     return cell; 

    } 
    return nil; 
}  

i due tipi di celle hanno altezze diverse che sono impostate correttamente. qualcuno potrebbe indicarmi la giusta direzione su come rendere il tipo Una cella personalizzata da visualizzare solo per le prime notizie (non riusabili)? grazie

+0

per la Versione rapida di questa domanda vedi [qui] (http://stackoverflow.com/ domande/30774671/uitableview-with-more-than-one-custom-cells-with-swift) – Honey

risposta

78

È necessario creare un identificatore di cella diversa per i due stili di cella:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

int feedIndex = [indexPath indexAtPosition:[indexPath length] - 1]; 
Feed *item = [[[[self selectedButton] category] feedsList] objectAtIndex:feedIndex + 1]; 

static NSString *CellIdentifier1 = @"Cell1"; 
static NSString *CellIdentifier2 = @"Cell2"; 

if(feedIndex == 0) { 

    MainArticleTableViewCell *cell = (MainArticleTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier1]; 

    if (cell == nil) { 
     cell = [[[MainArticleTableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier1] autorelease]; 
     [[[cell subviews] objectAtIndex:0] setTag:111]; 
    } 

    cell.feed = item; 

    return cell; 
} 
else { 
    NewsTableViewCell *cell = (NewsTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier2]; 

    if (cell == nil) { 
     cell = [[[NewsTableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier2 orientation:currentOrientation] autorelease]; 
     [[[cell subviews] objectAtIndex:0] setTag:111]; 
    } 

    cell.feed = item; 

    return cell; 
} 

return nil; 
} 
+0

grazie che ha funzionato. sai se è possibile impostare customcell differenti per sezioni diverse di una tabellaView? la sezione 0 avrà tipo A e la sezione 1 avrà tipo B. Grazie –

+0

ha trovato la risposta .. (NSIndexPath *) indexPath ha anche la proprietà della riga che è stata utile :) Sorin –

+0

int feedIndex = indexPath.row; - è abbastanza buono in prima linea –

8

non capisco del tutto alla tua domanda, ma ho notato due cose curiose. Se stai utilizzando due diversi tipi di celle, devi utilizzare due identificatori di cella distinti quando chiami "dequeueReusableCellWithIdentifier". Attualmente stai utilizzando lo stesso identificatore per entrambi, che non è corretto. Provare qualcosa di simile:

static NSString *MainArticleIdentifier = @"MainArticle"; 
static NSString *NewsIdentifier = @"News"; 

Inoltre, non ho mai visto nulla di simile:

int feedIndex = [indexPath indexAtPosition:[indexPath length] - 1]; 

Perché non basta usare:

int feedIndex = indexPath.row; 
0

in cellForRowAtIndexPath

if ("Condition for cell 1") { 
     cellV = ("customCell" *)[tableView dequeueReusableCellWithIdentifier:@"your ID cell in .xib"]; 

     if (cellV == nil) { 
      [[NSBundle mainBundle] loadNibNamed:@"YOUR-CELL-FILENAME" owner:self options:nil]; 
      cellV = "OUTLET-CEll-IN-VC"; 
     } 
    } else { 
     cellV = ("customCell" *)[tableView dequeueReusableCellWithIdentifier:@"your ID cell2 in .xib"]; 

     if (cellV == nil) { 
      [[NSBundle mainBundle] loadNibNamed:@"YOUR-CELL2-FILENAME" owner:self options:nil]; 
      cellV = "OUTLET-CEll-IN-VC"; 
     } 
    } 

[self configureCell:cellV indexpath:indexPath withClipVo:clip]; 

return cellV;