Domanda

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 di UIViewController, chiamo reloadData sul mio UITableView. numberOfSectionsInTableView viene generato e restituisce 1, quindi numberOfRowsInSection viene generato e restituisce un conteggio di array di 4 (per 4 stringhe nell'array). Tuttavia, il controllo non arriva mai a cellForRowAtIndexPath e non riesco a capire perché, soprattutto perché ho sezioni e righe valide. Le celle sono tutte visibili.

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

Mi chiedo se abbia qualcosa a che fare con me per reinizializzare UIViewController in Data.m al fine di impostarne le 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;
}
È stato utile?

Soluzione

In fillArrays, crei un altro controller di visualizzazione, ma non fai mai nulla con esso o con la sua vista, non vedresti 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 quella vista come sottoview di una vista corrente o si spinge come una nuova finestra tramite un controller di navigazione. Sono abbastanza sicuro che il tuo intero problema è che la loro tabella non viene mai aggiunta a una vista che chiunque effettivamente vede, quindi la tabella chiama gli altri metodi ma non chiama mai cellForRow perché il suo codice layoutSubviews non viene semplicemente chiamato.

Altri suggerimenti

Hai aggiunto il tuo tableView alla vista di UIViewController ?

È successo a me e quando l'ho aggiunto

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

quindi cellForRowAtIndexPath ha iniziato a funzionare.

Per l'amor di Google:

Se tableView: numberOfRowsInSection restituisce zero per qualsiasi motivo tableView: cellForRowAtIndexPath non verrà chiamato perché non ci sono righe per cui chiamarlo.

Controllare per assicurarsi che il delegato tableView e dataSource siano puntati su viewController

Non riesco a vedere nulla di sbagliato con il codice così com'è, hai verificato con punti di interruzione che cellForRow non è mai stato raggiunto (anche se vedo che hai un'istruzione log)?

Proverei anche solo per un controllo di integrità per restituire " 1 " esplicitamente in rowsInSection e codifica una stringa nella cella che stai restituendo in cellForRow.

Se tutto il resto fallisce, crea un nuovo controller di visualizzazione tabella dai modelli XCode e inserisci le tue chiamate - quindi quando funziona, lavora all'indietro sul perché il tuo codice non funziona.

Inoltre, sarebbe bello vedere il tuo codice di installazione viewDidLoad (aggiungi per rispondere sopra per favore).

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

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

In questo approccio, ho scoperto che l'esecuzione non è arrivata in cellForRowAtIndexPath fino a quando non ho inviato UIViewController.view sul retro dopo aver aggiunto UITableView come sottoview.

Arrivare così lontano era solo una parte del problema. A questo punto, sembrava che i miei altri controller di vista non rispondessero più agli eventi touch. Ho scoperto che quando aggiungo anche UITableView come sottoview a rootViewController, tutte le mie visualizzazioni ottengono gli eventi touch appropriati.

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

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

funziona perfettamente ogni volta che faccio cancellare o aggiornare alcune righe UITableView viene ricodificato al mio UIView.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top