4 Stimmen

Die UITableView dataSource muss eine Zelle von tableView:cellForRowAtIndexPath zurückgeben.

Ich habe ein UIViewController mit einer Tabelle und Zelle eingerichtet. Der Delegat und die Datenquelle sind mit der Tabelle verbunden. Allerdings erhalte ich diesen Fehler und bin verwirrt, warum. Der Code funktioniert, wenn ich ihn mit einem UITableViewController verwende, aber nicht mit einem UIViewcontroller. Der Grund, warum ich ein UIViewController verwenden möchte, ist, dass die Navigationsleiste mit der Tabelle scrollt, wenn ich einen UITableViewController verwende und mir hier geraten wurde, ein UIViewController zu verwenden und die Tabelle hinzuzufügen.

#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 - Tabellendatenquelle

- (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 - Tabellenansicht Delegat

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
obsID = [[self.teacherNames objectAtIndex:indexPath.row] obsID];
self.detailsButton.enabled = YES;
}

14voto

Vladimir Obrizan Punkte 2475

dequeueReusableCellWithIdentifier: gibt nil zurück, wenn kein wiederverwendbares Objekt in der Wiederverwendungs-Zellenwarteschlange vorhanden ist. (Siehe UITableView Referenz).

So sollte es sein:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"teacherCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        // Weitere Initialisierungen falls nötig.
    }
    Observations *currentList = [self.teacherNames objectAtIndex:indexPath.row];
    cell.textLabel.text = currentList.obsID;
    return cell;
}

1voto

pbergson Punkte 230

Ich denke, das Problem liegt am dequeueReusableCellWithIdentifier-Methode. Ich habe ein schnelles Beispielprojekt mit einer tableView in einem ViewController anstelle eines UITableViewControllers ausprobiert und den von Ihnen beschriebenen Fehler festgestellt. Als ich die Zelle manuell generiert habe mit

[UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"testCell"];

hat es gut funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X