2009-12-21 18 views
6

Sono piuttosto nuovo allo sviluppo di Iphone. quindi per favore portami se faccio delle domande molto semplici.UITableView cellforrowatindexpath non chiamato

Nella mia applicazione ho più viste (cioè file .xib). Facendo clic sul pulsante nella vista principale (CouponWebsiteViewController.Xib) l'applicazione dovrebbe caricare la seconda vista (BrowseList.Xib) che contiene un UITable e io devo popolare UITable con alcuni dati. Ho scritto seguente codice per popolare i dati su file BrowseList.m:

- (void) viewDidLoad{ 
    arrayData = [[NSArray alloc] init]; 
    arrayData = [arrayData arrayByAddingObject:@"dfsgdf"]; 
    arrayData = [arrayData arrayByAddingObject:@"aaaaaa"]; 
    self.lblNewScreen.text = [arrayData objectAtIndex:0]; 
    [super viewDidLoad]; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

// Customize the number of rows in the table view. 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [arrayData count]; 
} 

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] 
       initWithStyle:UITableViewCellStyleDefault 
       reuseIdentifier:CellIdentifier] 
       autorelease]; 
    } 

    NSString *cellValue = [arrayData objectAtIndex:indexPath.row]; 
    cell.textLabel.text = cellValue; 
    [tableView setEditing:YES animated:YES]; 
    return cell; 
} 

ma non è popolando i dati nella tabella, quando il debug questo codice ho scoperto che non sta eseguendo il metodo cellForRowAtIndexPath ma è il debug metodi NumberOfRowsInSection e numberOfSectionsInTableView.

Ma la cosa interessante è quando scrivo lo stesso codice sul CouponWebsiteViewController.m (cioè sulla vista principale) quindi sta compilando i dati nella tabella.

Il punto è che questo codice funziona correttamente nella vista principale ma non funziona per le altre visualizzazioni.

Qualcuno può dirmi cosa mi manca o qualsiasi altro modo per popolare l'UITable su visualizzazioni diverse dalla vista principale.

Grazie in anticipo. Gaurav

risposta

9

Non sono positivo ma ecco alcune idee.

  • penso che quando si mette che il codice matrice in viewDidLoad che sia troppo tardi. ViewDidLoad viene eseguito dopo che i dati sono già stati inseriti nella tabella. Prova a inserire questo codice nel metodo initWithStyle o in qualsiasi metodo init che hai. Oppure potresti anche inserire il metodo ViewWillAppear, ma assicurati di seguire questo suggerimento successivo.
  • L'altra cosa che si può provare è chiamare semplicemente [self.tableView reloadData] alla fine del metodo viewDidLoad. Anche se non è così ideale come il primo suggerimento.
+1

Aggiunta di ** [self.tableView reloadData] ** al parser ** - (void) parserDidEndDocument: (NSXMLParser *) parser ** ha funzionato bene per me perché avevo lo stesso problema. È necessario ricordare che NSXMLParser è un'operazione SAX. – subv3rsion

3

inizializzazione UITableView in viewWillAppear ...

5

Sei sicuro di impostare la classe come il DataSource sul tavolo? Per fare ciò, premi + fai clic sulla vista tabella in Interface Builder e trascinala sul proprietario del file sotto Segnaposto. Quindi selezionare dataSource (e probabilmente delegare anche, a seconda della configurazione della vista controller).

0

Si è assicurato di impostare la visualizzazione tabella come delegato?

Se si dispone di un UITableViewController, è questa esigenza in viewDidLoad:

[self.tableView setDelegate:self]; 

Se si dispone di un altro tipo di controller della vista, basta fare l'UITableView un IBOutlet, effettuare i collegamenti con il proprietario del file per tableViewDelegate e tableViewDataSource poi farlo in viewDidLoad:

[self.myTableProperty setDelegate:self]; 

anche assicurarsi di conformarsi ai protocolli UITableViewDelegate e UITableViewDataSource nel vostro.h file se il controller della vista non è un UITableViewController

Acclamazioni

0

Se l'array mutabile o l'array che si sta utilizzando per popolare il contenuto della cella è impostata come una proprietà nel file di intestazione. quindi assicurarsi di utilizzare sempre

self.yourArray = [[NSMutableArray alloc] init]; 
[self.yourArray addObject:@"Object1"]; 

e poi per ottenere il conteggio in numberOfRowsInSection pure è necessario accedere come:

return [self.yourArray count]; 

Questo è più o meno come il puntatore this si usa per riferirsi alle tue variabili di istanza. E sì, naturalmente, è necessario tenere a mente anche se hai impostato il data source e il delegato di UITableView al proprietario del file. Inoltre, hai incluso UITableViewDelegate e UITableViewDataSource nel file di intestazione del viewController.

Spero che ti aiuti. Buona fortuna. Felice codifica! Saluti !!

1

Ho riscontrato qualche problema simile lì. La vista tabella delegato e origine dati sono impostati correttamente e (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section restituisce anche un conteggio positivo. Ma - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath non viene mai chiamato.

Ho provato i metodi prima, ma non funziona neanche. Infine, ho notato che ho dimenticato di aggiungere la vista tabella come vista secondaria del mio controller di visualizzazione. Dopo averlo fatto, funziona come un incantesimo.

4

Suggerisco di verificare che le dimensioni del tavolo richiedano la visualizzazione delle righe.

In effetti, potrebbe essere un motivo per cui il metodo cellForRowAtIndexPath non viene chiamato, tuttavia è necessario chiamare numberOfRowsInSection.

In questo caso non vedrai nulla nel tuo tavolo.

2

Vecchia domanda, ma interverò. Per gli altri.

Ci sono diversi motivi per cui una vista tabella non si aggiorna e cellForRowAtIndexPath: non viene chiamato.

Se stai usando direttamente un UITableViewController allora amy essere che il "numberOfRowsInSection:" il metodo sta tornando 0

Se stai usando un UITableView nel vostro controller della vista. è probabile che tu non abbia adottato i protocolli corretti e implementato i giusti metodi, inoltre se stai utilizzando uno xib o uno storyboard a cui non hai assegnato il delegato giusto e l'origine dati è l'altro potenziale problema.

Infine, se si sta utilizzando una sottoclasse di UITableViewController allora è possibile che tu non abbia sovrascritto uno dei metodi predefiniti e di nuovo numberOfRowsInSection sta tornando 0.

3

Per tutti coloro che si imbatte in questo problema, ho risolto questo con l'aggiunta di controllore della mia TableView come un bambino al controller genitore utilizzando:

UITableViewController * table = [[UITableViewController alloc] init]; 
... 
[self.view addSubview:table.tableView]; 
[self addChildViewController:table]; 
+0

Perché funziona? C'è qualche spiegazione per questo? – heiko

-1

ero anche avere quel problema su UITableView, ho anche impostare la sorgente di dati e delegato alla vista tavolo, ma il mio metodo cellForRowAtIndexPath non è stato chiamato.

Soluzione:

  • mia rete bloccato il mio metodo (utilizzando firewall). Ho chiesto al mio amministratore di rete e mi è stato concesso l'accesso completo alla rete, quindi è stato chiamato il mio metodo cellForRowIndexPath.

  • quando la risposta proviene da un servizio Web, a causa della risposta del blocco di rete era nero, quindi non è stato chiamato il metodo cellForRowIndexPath.

0

Bene, posso aggiungere un semplice punto per tutti con questo problema. Ti consiglio di utilizzare il debug e fare in modo che:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

non restituisce 0. Se questa funzione non è implementata o se restituisce 0, il metodo:

cellForRowAtIndexPath:(NSIndexPath *)indexPath 

non si chiama affatto poiché non ci sono celle da visualizzare.

0

Verificare che la vista tabella sia stata aggiunta alla vista. In caso contrario, verranno attivati ​​altri metodi di deleghe e origine dati, ma non cellforrow :)

Problemi correlati