Question

Après avoir analysé les données JSON dans une classe de données, j'ai défini la propriété NSArray * headlines de UIViewController dans une méthode fillArrays de la même classe de données. Dans la méthode viewDidAppear de mon UIViewController, j'appelle reloadData sur mon UITableView. numberOfSectionsInTableView déclenche et renvoie 1, puis numberOfRowsInSection se déclenche et renvoie un nombre de tableaux de 4 (pour 4 chaînes du tableau). Cependant, le contrôle n'atteint jamais cellForRowAtIndexPath et j'ai du mal à comprendre pourquoi, surtout que j'ai des sections et des lignes valides. Les cellules sont toutes visibles.

J'ai ajouté les protocoles UITableViewDataSource et UITableViewDelegate à l'interface UIViewController et défini le délégué et la source de données UITableView sur self dans viewDidLoad (qui est également vérifié par les méthodes de comptage de lignes et de sections appelées).

Je me demande s'il ne me faut pas réinitialiser UIViewController dans Data.m pour définir ses propriétés.

Dans Data.m:

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

Dans 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;
}
Était-ce utile?

La solution

Dans les fillArrays, vous créez un autre contrôleur de vue - mais vous ne faites jamais rien avec ce dernier ni avec sa vue, vous ne verriez jamais cette vue. Vous n'appelleriez jamais manuellement viewDidAppear non plus, cela se produit automatiquement lorsqu'une vue des contrôleurs de vue est affichée (UNIQUEMENT dans le contexte d'un contrôleur de navigation).

Normalement, le processus consiste à créer un contrôleur de vue et à ajouter cette vue en tant que sous-vue d'une vue actuelle ou à l'insérer dans une nouvelle fenêtre via un contrôleur de navigation. Je suis presque sûr que votre problème est que leur table n'est jamais ajoutée à une vue que quiconque voit réellement. La table appelle donc les autres méthodes, mais jamais cellForRow, car son code layoutSubviews n'est tout simplement pas appelé.

Autres conseils

Avez-vous ajouté votre tableView à la vue de UIViewController ?

Cela m'est arrivé et quand j'ai ajouté ceci

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

puis cellForRowAtIndexPath a commencé à fonctionner.

Pour l'amour de Google:

Si tableView: numberOfRowsInSection renvoie zéro pour quelque raison que ce soit tableView: cellForRowAtIndexPath ne sera pas appelé car il n'y a pas de ligne à appeler.

Assurez-vous que le délégué tableView et la source de données pointent vers le contrôleur de vue

Je ne vois rien qui cloche dans le code tel quel, avez-vous vérifié avec les points d'arrêt que cellForRow n'est jamais atteint (même si je vois que vous avez une instruction de journal)?

De plus, j’essaierais de renvoyer un "1" et un "test de cohérence". explicitement dans rowsInSection et coder en dur une chaîne dans la cellule que vous renvoyez dans cellForRow.

Si tout échoue, créez un nouveau contrôleur d'affichage de table à partir des modèles XCode et placez-y vos appels. Lorsque cela fonctionne, revenez en arrière pour expliquer pourquoi votre code ne fonctionne pas.

En outre, il serait bon de voir votre code d'installation viewDidLoad (ajouter à la réponse ci-dessus s'il vous plaît).

si vous définissez le délégué et la source de données sur viewDidLoad, cela peut être la source de votre bogue. Pouvez-vous définir la source de données et déléguer dans init?

Je ne suis pas sûr que vous ajoutiez votre UITableView en tant que sous-vue à UIViewController.view. C'était mon approche quand même.

Dans cette approche, l’exécution n’était pas entrée dans cellForRowAtIndexPath avant d’avoir envoyé UIViewController.view à l’arrière après l’ajout de UITableView en tant que sous-vue.

Aller aussi loin n’était qu’une partie du problème. À ce stade, il semblait que mes autres contrôleurs de vue ne répondent plus aux événements tactiles. J'ai constaté que lorsque j'ajoute également UITableView en tant que sous-vue à rootViewController, toutes mes vues ont les événements tactiles appropriés.

Merci beaucoup pxl. Lorsque je déplace l'initialisation UITableView de viewDidLoad vers:

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

Cela fonctionne parfaitement chaque fois que je supprime ou mets à jour certaines lignes de la UITableView qui sont remodelées dans UIView.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top