Problema tableview

di il
6 risposte

Problema tableview

Ciao a tutti,per impratichirmi con objective c, in particolare con le librerie per iphone,stavo provando a creare una table view con varie celle e inserirci dentro delle parole e al tocco di una cella deve apparire un messaggio con il contenuto della cella stessa.E' andato tutto a buon fine tranne per due piccolissimi problemi:

1)quando tocco per la prima volta(intendo subito dopo l'avvio dell'app) una cella non succede niente, poi se ne tocco un'altra va tutto bene(ciò appare il messaggio), è come se non rilevasse il primissimo
"click"

2)quando incomincia a rilevare i tap nel messaggio non mi visualizza il giusto contenuto della cella che ho veramente premuto ma o quello della celle precedente e alcune volte di quella successiva

ecco vi posto il codice per capire meglio

- (void)viewDidLoad
{
   [super viewDidLoad];
    //elementi da visualizzare nella tabella
   lista = [[NSMutableArray alloc] initWithObjects:@"primo",@"secondo",@"terzo",@"quarto" ,nil];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
   return [lista count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   static NSString *CellIdentifier = @"Cell";//identificatore cella
   cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];//allocazione cella
   
   cell.textLabel.text = [lista objectAtIndex:indexPath.row];
   return cell;
}
Vi ringrazio per l'attenzione e spero in una vostra risposta, anche perchè sono sicuro che sia una stupidaggine solo che non riesco a trovarla

6 Risposte

  • Re: Problema tableview

    Nessuno che mi può aiutare?
  • Re: Problema tableview

    Il problema è nel cellForRowAtIndexPath, che è la callback che si occupa di disegnare le celle.
    Il dequeue si utilizza perchè cosi il sistema riesce a riutilizzare le celle con lo stesso layout, senza mantenersi in memoria tutte le celle.

    Per questo motivo, è opportuno che tu chiami il dequeue e, se non è riuscito a prendere una cella non utilizzata, istanzia una cella con quell identifier, in modo che questa venga riutilizzata quando vai a scrollare.

    Con le parole non sono molto bravo, col codice non sono chissà chi, ma li ho meno problemi ad esprimere ciò che voglio dire
    
    static NSString *CellIdentifier = @"Cell";
       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
       if (cell == nil)
       {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier"];
       }
       cell.textLabel.text = [lista objectAtIndex:indexPath.row];
       return cell;
    
    Cosi dovresti aver risolto entrambi i problemi. Se continuano, devi postare la callback didSelectRowAtIndexPath e farmi vedere cosa c'hai scritto dentro.

    Ciao
  • Re: Problema tableview

    Ciao,allora ho cercato anche su internet ma non riesco proprio a capire cos'è il "dequeue".
    Cioè è un sistema che salva temporaneamente le celle?
  • Re: Problema tableview

    Quando hai una tableView, vengono istanziate il numero di celle visualizzate a schermo. Quando scrolli passa in quella callback per disegnare la nuova cella. Col dequeue lui verifica se c'è qualche cella con lo stesso identifier di quella che devi mostrare che, non essendo piu visualizzata, può essere riutilizzata. In modo che le celle istanziate siano sempre un numero ragionevole e mai esagerato. In quel modo verifica quindi se c'è qualche cella riutilizzabile perchè non piu mostrata a schermo. Se la trova ottieni l'istanza della tua nuova cella, altrimenti devi istanziarne una nuova. tutto qua.
  • Re: Problema tableview

    A ecco,quindi se ho capito bene è una specie di controllore che si occupa di verificare se quella cella è già stata allocata, e se lo è la riusa senza che ne alloca un'altra uguale.
    Ho capito bene?
  • Re: Problema tableview

    In soldoni si. Se hai una tableview le cui celle sono tutte uguali, tu avrai solo 6 (o qualcuna in piu) celle istanziate, quello che cambiano sono i dati al suo interno quando scrolli. Pensa quanta memoria risparmi.... notevole, no?

    cmq sei riuscito a far funzionare il tutto?
Devi accedere o registrarti per scrivere nel forum
6 risposte