web-dev-qa-db-fra.com

cellForRowAtIndexPath non appelé, mais numberOfRowsInSection appelé

J'ai un problème simple mais je ne comprends pas ce que c'est. J'ai une UIViewControler (appelée RootController) qui charge une UIView (appelée SecondView) contenant une tableView. Le problème est que la UIView appelle les numberOfSectionsInTableView et la numberOfRowsInSection mais n'appelle pas cellForRowAtIndexPath et la vue tabulaire n'est pas affichée. Le code de la RootViewController est:

SecondView *secondView = [[seconddView alloc] initWithFrame:CGRectMake(0, 60, self.view.bounds.size.width, self.view.bounds.size.height)];
[self.view addSubview:secondView];

Et le code de la SecondView est:

@interface SecondView () <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic,retain) UITableView *table;
@end

@implementation SecondView
@synthesize table;

- (id)initWithFrame:(CGRect)frame {
   self = [super initWithFrame:frame];
   if (self) {
   self.table = [[UITableView alloc] init];
   self.table.delegate = self;
   self.table.dataSource = self;
   [self addSubview:self.table];
   }
 return self;
}

- (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];
     }
  cell.textLabel.text = @"Prova";
  return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
   return 5;
}

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

Pouvez-vous m'aider à trouver le problème? Je vous remercie.

17
Anna565

Vous devez définir le cadre de UITableView

39
Hussain Shabbir

Cela pourrait également se produire si reloadData est appelé sur un autre thread. Assurez-vous qu'il est exécuté sur le thread principal, car tous les éléments de l'interface utilisateur doivent se trouver sur le thread principal.

dispatch_async(dispatch_get_main_queue(),{
            self.myTableView.reloadData()
        });
10
spfursich

Mon problème était que j'avais une classe simple implémentant mon délégué et ma source de données, mais la durée de vie de la classe simple était trop courte.

Je faisais

MyDataSourceClass* myClass = [[MyDataSourceClass alloc] initWithNSArray:someArray];
tableView.dataSource = self.tableViewDataSource;
tableView.delegate = self.tableViewDataSource;
[tableView reloadData];

// end of function, myClass goes out of scope, and apparently tableView has a weak reference to it

Nécessaire pour faire

self.tableDataSource = [[MyDataSourceClass alloc] initWithNSArray:someArray];
tableView.dataSource = myClass;
tableView.delegate = myClass;
[tableView reloadData];
// now at the end of the function, tableDataSource is still alive, and the tableView will be able to query it.

Notez que le code ci-dessus est un pseudocode de mémoire. Inspirez-vous du concept "assurez-vous que votre source de données/votre délégué vit longtemps", mais ne le copiez pas car vous devez le faire (par exemple, définir votre cadre, etc.).

9
ArtHare

Dans XCode6, le même problème étrange se posait lorsque "Ajouter des contraintes manquantes" est appliqué à tableView sur Storyboard pour ajuster les vues.

Pour résoudre ce problème sur Storyboard, commencez par définir des contraintes claires:

enter image description here

puis appliquez les contraintes de la manière suivante:

enter image description here

6
Aqib Mumtaz

Vous ne pouvez appeler la vueDU CONTR&OCIRC;LEUR DE VUE QU'APR&EGRAVE;S QUEviewDidLoad est appelé . Vous ne pouvez pas interagir avec self.view dans votre méthode init

- (void)viewDidLoad {
    [super viewDidLoad];
    self.table = [[UITableView alloc] initWithFrame:self.view.bounds];
    self.table.delegate = self;
    self.table.dataSource = self;
    [self addSubview:self.table];
}

Dans votre cas, vous devez initialiser votre tableview avec un cadre (comme suggéré dans le code ci-dessus). Assurez-vous simplement d’ajouter le code dans viewDidLoad dans votre viewController.

SecondView *secondView = [[seconddView alloc] initWithFrame:CGRectMake(0, 60,     self.view.bounds.size.width, self.view.bounds.size.height)];
[self.view addSubview:secondView];
1
Thomas Keuleers

J'ai le même problème que toi: 

J'ai seulement une méthode du protocole de délégué qui a appelé et c'est numberOfRowsInSection . En attendant, j'ai une seconde méthode cellForRowAtIndexPath qui n'a pas été appelée.

La raison de ce comportement est que mon numberOfRowsInSection a renvoyé 0 ligne et cellForRowAtIndexPath n'a pas appelé car il devait dessiner des cellules 0.

0
wm.p1us