2012-03-06 8 views
5

Sto utilizzando gli storyboard ios5 con un UITableViewController con una sottoclasse UITableViewCell. Non voglio progettare gli elementi visivi della cella nello storyboard designer per la visualizzazione, perché voglio utilizzare una sottoclasse riutilizzabile di UITableViewCell (in particolare TDBadgedCell).dequeueReusableCellWithIdentifier che non restituisce la cella del mio tipo personalizzato

Ho impostato l'identificativo della cella nella finestra di progettazione dello storyboard e tutte le righe vengono caricate correttamente in UITableView purché non imposti nessuna delle proprietà univoche di TDBadgedCell. Se imposto la proprietà badgeString sebbene sia univoca per TDBadgedCell, ottengo un'eccezione. Ho ristretto che dequeueReusableCellWithIdentifier: non restituisce una cella di tipo TDBadgedCell.

Mi sto solo scontrando con un UITableViewController. Ho un UIViewController con UITableView incorporato configurato nello stesso modo e non è un problema. Qualche idea?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 
static NSString *CellIdentifier = @"PhoneNumberCell"; 
TDBadgedCell *cell = (TDBadgedCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    cell = [[TDBadgedCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 

if ([cell isKindOfClass:[TDBadgedCell class]]) 
{ 
    NSLog(@"It is TDBadgedCell"); 
} 
else 
    NSLog(@"It is NOT TDBadgedCell"); 
+6

hai cambiato anche la "Custom Class" in TDBadgedCell in storyboard designer? – fengd

+0

possibile duplicato di [Prototipo celle in un pennino invece di uno storyboard] (http://stackoverflow.com/questions/8574188/prototype-cells-in-a-nib-instead-of-a-storyboard) - possibile solo, Non sono sicuro di avere uno xib separato per questa cella o meno. – jrturton

+0

1 ° giugno - È andata così! Grazie! Non sono sicuro di come contrassegnare la tua risposta come risposta. – scubasteve

risposta

0

ho avuto un problema simile in che sto sottoclassi UITableViewCell ma non utilizzando storyboard. Ecco la mia soluzione per utilizzare diverse classi di celle a seconda che l'utente abbia acquistato la funzionalità di sblocco dell'app. Spero che aiuti qualcuno.

In breve, ho avuto la cella con diversi oggetti tra cui un oggetto UITextView. Volevo bloccare la funzionalità di copia e incolla dell'oggetto UITextView nella versione lite, ma poi rilasciare la funzione una volta che l'utente aveva acquistato il prodotto in-app.

Avevo due classi UITableViewCell, una con UITextView così com'è e un'altra con UITextView suddivisa in sottoclassi con canBecomeFir-responder che restituiva NO. In questo modo l'utente poteva ancora scorrere su e giù i dati di UITextview ma non copiare e incollare i dati.

Ecco il codice e tutto quello che dovevo fare era rinominare gli identificatori di riutilizzo.

PERCHÉ? Perché [self.tableview reloadData] non ricostruiva le celle con la nuova classe in quanto la cella era ancora esistente. Le nuove cellule fuori dallo schermo otterrebbero la nuova classe, ma quelle esistenti non lo farebbero. Questa soluzione ricostruisce tutte le celle una volta disattivate dopo l'acquisto, sbloccando la funzionalità aggiunta.

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


if (your test if in-app was purchased is yes) 
{ 
static NSString *MyIdentifier = @"MyCell"; 

FrontCell *cell = (FrontCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 

if (cell == nil) 
     { 
     cell = [[FrontCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
     cell.shouldIndentWhileEditing = NO; 
    } 

//....///  

cell.trackDetails.text = [yourObject objectAtIndex:indexPath.row]; 
cell.trackDetails.delegate = self; 
cell.trackDetails.tag = indexPath.row; 


return cell; 
} 
else // inapp not purchased 
{ 
    static NSString *MyLockedIdentifier = @"MyLockedCell"; 

    FrontCellLocked *cell = (FrontCellLocked *)[tableView dequeueReusableCellWithIdentifier:MyLockedIdentifier]; 

    if (cell == nil) 
    { 
     cell = [[FrontCellLocked alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyLockedIdentifier]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
     cell.shouldIndentWhileEditing = NO; 
    } 

    //....///  

cell.trackDetails.text = [yourObject objectAtIndex:indexPath.row]; 
cell.trackDetails.delegate = self; 
cell.trackDetails.tag = indexPath.row; 


return cell; } 
} 
0

Nello storyboard, è possibile impostare la proprietà di Classe personalizzata per una sottoclasse di UITablviewCell.
Quindi il metodo dequeueReusableCellWithIdentifier restituirà la cella con il tipo della sottoclasse.

0

Penso che si stia utilizzando un metodo sbagliato per dequeuing delle celle.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    UITableViewCell *cell = [self.tblProfileInfo dequeueReusableCellWithIdentifier:@"PostCell" forIndexPath:indexPath]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    return cell; 

} 

Alla fine si è dimenticato per indexPath.

+0

Provare a cambiare "TDBadgedCell * cell = (TDBadgedCell *) [tableView dequeueReusableCellWithIdentifier: CellIdentifier];" a "TDBadgedCell * cell = (TDBadgedCell *) [tableView dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath: indexPath];" –

Problemi correlati