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.
Vous devez définir le cadre de UITableView
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()
});
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.).
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:
puis appliquez les contraintes de la manière suivante:
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];
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.