2009-10-22 18 views
5

Dopo aver analizzato i dati JSON in una classe Data, ho impostato la proprietà dei titoli NSArray * di UIViewController in un metodo fillArrays della stessa classe Data. Nel metodo viewDidAppear del mio UIViewController, chiamo reloadData sul mio UITableView. numberOfSectionsInTableView fa scattare e restituisce 1, quindi numberOfRowsInSection si attiva e restituisce un numero di array di 4 (per 4 stringhe nell'array). Tuttavia, il controllo non arriva mai a cellForRowAtIndexPath e sto avendo il tempo più difficile a capire perché, soprattutto perché ho sezioni e file validi. Le celle sono tutte visibili.cellForRowAtIndexPath non chiamato; sezioni restituisce 1 e restituisce righe 4

Ho aggiunto i protocolli UITableViewDataSource e UITableViewDelegate all'interfaccia UIViewController e ho impostato il delegato di UITableView e dataSource su self in viewDidLoad (che viene verificato anche dai metodi di conteggio di riga e sezione chiamati).

Mi chiedo se ha qualcosa con me per reinizializzare l'UIViewController in Data.m per impostare le sue proprietà.

In Data.m:

- (void)fillArrays:(NSArray *)jsonObjs { 
    NSLog(@"fillArrays");    
    HeadlinesRootViewController *hrvc = [[HeadlinesRootViewController alloc] init]; 
    hrvc.headlines = [self getJsonValuesForKey:@"headline" inArrayOfObjects:jsonObjs]; 
    [hrvc viewDidAppear:NO]; 
} 

In ViewController.m:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"viewDidLoad"); 
    // Table view 
    headlineTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 180, self.view.bounds.size.width, 300) style:UITableViewStylePlain]; 
    [headlineTableView setDelegate:self]; 
    [headlineTableView setDataSource:self]; 
    // Temporary 
    self.headlines = [[NSMutableArray alloc] initWithObjects:@"headline1", @"headline2", @"headline3", @"headline4", nil]; 



    [self.view addSubview:headlineTableView]; 
    self.headlineTableView = headlineTableView; 
    [headlineTableView release]; 
} 
- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    NSLog(@"viewdidappear"); 
    NSLog(@"headlines: %@", self.headlines); // Returns an array of 4 headlines 
    if([self.headlines count] != 0){ 
     [self.headlineTableView reloadData]; 
    } 
} 

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    NSLog(@"numberOfRowsInSection: %d", [self.headlines count]); 
    return [self.headlines count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"cellForRowAtIndexPath"); 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    cell.text = [[NSString alloc] initWithFormat:@"%@", [self.headlines objectAtIndex:indexPath.row]]; 

    return cell; 
} 
+0

Si potrebbe desiderare di postare qualche codice – coneybeare

risposta

4

In fillArrays, si crea un altro controller di visualizzazione, ma non si fa mai niente con esso o la sua vista, non si vedrebbe mai quella vista. Non chiameresti mai viewDidAppear manualmente, ciò accade automaticamente quando viene visualizzata una vista dei controller di visualizzazione (SOLO nel contesto di un controller di navigazione).

Normalmente il flusso è, si crea un controller di visualizzazione e si aggiunge tale vista come sottoview di una vista corrente, oppure si spinge come una nuova finestra tramite un controller di navigazione. Sono abbastanza sicuro che l'intero problema è che la tabella non viene mai aggiunta a una vista che chiunque vede, quindi la tabella chiama gli altri metodi, ma non chiama mai cellForRow perché il suo codice layoutSubviews semplicemente non viene chiamato.

+0

Era esattamente così. Stavo creando una copia di UIViewController. Tutto quello che dovevo fare era passare il riferimento a quello esistente alla classe Data attraverso un parametro di metodo. Grazie a tutti per il vostro aiuto con il mio primo numero qui. – azdev

0

Controllare per assicurarsi che il delegato tableView e dataSource sono puntati al viewController

0

non riesco a vedere Qualcosa non va nel codice così com'è, hai verificato con i punti di interruzione che cellForRow non viene mai raggiunto (anche se vedo che hai una dichiarazione di registro)?

Inoltre vorrei provare solo per un controllo di integrità per restituire "1" esplicitamente in rowsInSection e hardcode una stringa nella cella che si sta restituendo in cellForRow.

Se tutto il resto fallisce, creare un nuovo controller di visualizzazione tabella dai modelli XCode e inserire le chiamate in quel punto, quindi quando funziona, tornare indietro al motivo per cui il codice non funziona.

Inoltre, sarebbe bello vedere il tuo codice di configurazione viewDidLoad (aggiungi alla risposta sopra per favore).

0

se si sta impostando il delegato e l'origine dati su viewDidLoad, potrebbe essere la fonte del bug. Puoi impostare l'origine dati e delegare in init?

+0

Quando ho spostato il codice UITableView da viewDidLoad a init, non è stato chiamato numberOfSectionsInTableView, sfortunatamente. – azdev

0

Non sono sicuro di aver aggiunto UITableView come sottoview a UIViewController.view. Questo era il mio approccio comunque.

In questo approccio, ho trovato che l'esecuzione non è stata eseguita in cellForRowAtIndexPath finché non ho inviato UIViewController.view sul retro dopo aver aggiunto UITableView come sottoview.

Arrivare lontano era solo una parte del problema.A questo punto, sembrava che i miei altri controller di visualizzazione non rispondessero più agli eventi di tocco. Ho scoperto che quando aggiungo UITableView come sottoview a rootViewController, tutte le mie viste hanno gli eventi di tocco appropriati.

4

Hai aggiunto il tuo tableView alla vista di UIViewController?

E 'successo a me, e quando ho aggiunto questo

[self.view addSubview:table]; 
[table release]; 

poi cellForRowAtIndexPath iniziato a lavorare.

+0

Bello e semplice. Penso che questo sia quello che Kendall sta ottenendo, sopra, ma questo aveva senso per me immediatamente. Grazie! –

4

Per l'amor di Google:

Se tableView:numberOfRowsInSection restituisce zero per qualsiasi motivo tableView:cellForRowAtIndexPath non andranno chiamati perché non ci sono righe da chiamare per.

+0

Per gli altri che seguono a casa, si prega di assicurarsi che la logica booleana sia corretta in 'numberOfRowsInSection'. Sono uno sviluppatore esperto di iOS e ho passato l'ultima ora cercando di capire perché le mie celle non sarebbero state visualizzate: la mia condizione 'else' alla fine del controllo lungo le sezioni stava impostando ** righe = 0 **. WOOF! – kyleturner

0

Grazie mille pxl. Quando sposto l'inizializzazione UITableView da viewDidLoad a:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil" 

funziona perfettamente quando mai faccio cancellare o aggiornare alcune righe del UITableView viene reloded alla mia UIView.

Problemi correlati