UITableView de la source de données doit retourner une cellule de tableView: cellForRowAtIndexPath
J'ai mis en place un UIViewController
avec un affichage de tableau et de cellule de ajouté. Le délégué de source de données et sont liés à la vue de la table. Cependant j'obtiens cette erreur et je suis confus quant à pourquoi. Le code fonctionne lorsque je l'utilise avec un UITableViewController
mais pas avec un UIViewcontroller
. La raison pour vouloir utiliser un UIViewController
est que la barre de navigation défile avec la table lors de l'utilisation d'un UITableViewController
et on m'a conseillé ici d'utiliser un UIViewController
et ajouter l'affichage de la Table.
#import "ObViewControllerObservationsTable.h"
#import "ObAppDelegate.h"
#import "Observations.h"
#import "ObViewControllerTableDetail.h"
#import "ObViewControllerMainMenu.h"
@interface ObViewControllerObservationsTable ()
@property (nonatomic, strong) NSArray *teacherNames;
@property (nonatomic, readonly) NSManagedObjectContext *managedObjectContext;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *detailsButton;
@end
@implementation ObViewControllerObservationsTable
- (void)viewDidLoad
{
[super viewDidLoad];
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Observations"];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"obsTeacherName" ascending:YES]];
NSError *error = nil;
self.teacherNames = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
[self.tableView reloadData];
}
- (NSManagedObjectContext *) managedObjectContext
{
return [(ObAppDelegate *) [[UIApplication sharedApplication] delegate] managedObjectContext];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.teacherNames.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"teacherCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
Observations *currentList = [self.teacherNames objectAtIndex:indexPath.row];
cell.textLabel.text = currentList.obsID;
return cell;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
[self.managedObjectContext deleteObject:[self.teacherNames objectAtIndex:indexPath.row]];
[self.managedObjectContext save:nil];
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Observations"];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"obsTeacherName" ascending:YES]];
NSError *error = nil;
self.teacherNames = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (self.teacherNames.count == 0)
{
self.detailsButton.enabled = NO;
}
else
{
self.detailsButton.enabled = YES;
}
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
else if (editingStyle == UITableViewCellEditingStyleInsert) {
}
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
obsID = [[self.teacherNames objectAtIndex:indexPath.row] obsID];
self.detailsButton.enabled = YES;
}
Comprenez-vous pourquoi la barre de navigation des parchemins? Me semble étrange et je suggère de fixation que le "problème" plutôt que d'essayer de faire un UIViewController agir comme un UITableViewController.
J'ai essayé, mais les conseils d'ici a été de refaire de cette façon. Apprécions l'aide.
Cette question: stackoverflow.com/q/15419486/1286639 ?
J'ai essayé, mais les conseils d'ici a été de refaire de cette façon. Apprécions l'aide.
Cette question: stackoverflow.com/q/15419486/1286639 ?
OriginalL'auteur RGriffiths | 2013-04-11
Vous devez vous connecter pour publier un commentaire.
dequeueReusableCellWithIdentifier:
retournenil
si aucun objet réutilisable existe dans le réutilisables cellules de la file d'attente. (Voir UITableView de référence).Ici est comment il devrait être:
le sélecteur de
tableView:cellForRowAtIndexPath:
est généralement envoyé à un objet qui implémenteUITableViewDatasource
protocole. Veuillez vérifier, et dont l'objet est référencé danstableView.datasource
propriété? Il me semble que vous aveztableView.datasource = tableView;
. Ou s'il vous plaît vérifier les fixations dans Interface Builder.tableView.datasource
doit pointer vers votre vue-contrôleur où vous mettez en œuvretableView:cellForRowAtIndexPath:
. Désolé, ne peut pas en dire spécifique, sans voir le code ou d'un projet.Je suis désolé pour le délai de réponse - j'ai de très rares accès à internet. La source de données et le délégué sont actuellement liés à la vue de la table. Je ne suis pas sûr de savoir comment le relier à la Vue-Contrôleur que ce n'est pas une option à partir de la table de montage séquentiel.
d'habitude, on devrait mettre en œuvre comprennent à la fois les protocoles dans la déclaration d'interface:
@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDatasource>
. Ensuite, dans le Storyboard, juste un lien de la source de données et de déléguer des points de vente à votre vue-contrôleur.OriginalL'auteur Vladimir Obrizan
Je pense que le problème est le dequeueReusableCellWithIdentifier méthode. J'ai essayé un rapide exemple de projet avec une tableView dans une vue contrôleur plutôt que dans un UITableViewController et a rencontré l'erreur que vous décrivez. Quand j'ai généré manuellement la cellule à l'aide
[UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"testCell"];
il a bien fonctionné.
Je pense que Vova est juste (encore une fois, excellente réponse originale à cette question que vous devriez probablement accepter). Si j'étais vous, je voudrais changer temporairement tableView:numberOfRowsInSection pour renvoyer un nombre fixe. Qui va diviser le problème en deux: avez-vous un problème avec la configuration de la source de données, ou avec teacherNames?
D'ailleurs, je constate que vous aussi mettre en œuvre les numberOfSectionsInTableView: méthode, mais de retour 1. Si vous connaissez le nombre de sections sera toujours 1, vous pouvez supprimer le code. La méthode est optionnel, par défaut à 1.
OriginalL'auteur pbergson