it-swarm.com.de

tableView reloadData funktioniert nicht

Wenn ich [tableView reloadData] anrufe, wird die Funktion - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath nicht ausgelöst. Warum?

Hier ist meine TableView.m

@implementation TableView
@synthesize managedObjectContext;
@synthesize controller = _controller;
@synthesize tableView = _tableView;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

    }
    return self;
}
-(id)init
{
    self = [super init];
    if (self) {
        NSLog(@"%s",__PRETTY_FUNCTION__);
        self.del = [[UIApplication sharedApplication] delegate];
        self.managedObjectContext = self.del.managedObjectContext;

        [self performControllerFetch];
    }
    return self;
}


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    ...
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    ...
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ...
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

    ...
}

-(void)reloadTableView
{
    NSLog(@"%s",__PRETTY_FUNCTION__);

    [self.tableView reloadData];

}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {

    NSLog(@"%s",__PRETTY_FUNCTION__);
    UITableView *tableView = self.tableView;

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                                  withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray
                                               arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:[NSArray
                                               arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}


- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id )sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    // The fetch controller has sent all current change notifications, so tell the table view to process all updates.
    [self.tableView endUpdates];
}

@end

TableView.h

@interface TableView : UITableView <UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate>

@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong) AppDelegate *del;
@property (nonatomic, strong) NSFetchedResultsController *controller;
@property (weak, nonatomic) IBOutlet TableView *tableView;

-(void)reloadTableView;
-(void)performControllerFetch;
@end
20
iCode

Es sieht so aus, als würden Sie niemals die Eigenschaften delegate und datasource in Ihrer Tabellenansicht festlegen, nicht wahr? Sie implementieren die Methoden in diesen Protokollen in tableview.m, setzen die beiden Eigenschaften jedoch nicht auf self, sodass der Aufruf von reloadData keine Auswirkungen hat.

Hilft das?

Bearbeiten:

Anscheinend haben Sie eine tableView -Eigenschaft für eine Unterklasse von UITableView festgelegt und eine Verbindung zu einer Interface Builder-Datei hergestellt. Dies ist eine ungewöhnliche Konfiguration (eine Tabellenansicht innerhalb einer Tabellenansicht). Normalerweise haben Sie so etwas wie eine UIViewController -Unterklasse, die an eine XIB angeschlossen ist, und legen eine fest

@property (nonatomic, strong) IBOutlet UITableView * tableView

in dieser Unterklasse oder etwas Ähnliches. Behandeln Sie dann das Abrufen von Daten und die Delegierung/Datenquelle für die Tabellenansicht in dieser Unterklasse des Viewcontrollers.

Aber hier ist es wegen der verschachtelten UITableView nicht so einfach. Gibt es einen Grund für diesen Entwurf? Ich empfehle, zu etwas zu wechseln, das ich oben beschrieben habe, um das Setup klarer zu gestalten.

Fügen Sie Ihrer NSLog -Methode auch einige init -Anweisungen hinzu, um festzustellen, ob die Tabellenansicht! = Nil und die Delegat- und Datenquelleneigenschaften festgelegt wurden. Mein Verdacht ist, dass die Verbindung nicht hergestellt wird.

Unabhängig vom vorliegenden Problem müssen Sie @synthesize ivar = _ivar nicht mehr manuell eingeben. Dies erfolgt automatisch nach der Unterstreichungskonvention.

14
Alfie Hanssen

Ich hatte das gleiche Problem, dass der reload nicht funktionierte. Ich glaube, die delegate -Methode, von der ich sie nannte, befand sich in einem background-Thread, der das Problem verursacht hat. Meine Lösung bestand darin, eine new-Methode (unten) zu erstellen und stattdessen reload aufzurufen, wobei sichergestellt ist, dass sie auch vom main-Thread aus aufgerufen wird:

- (void) tocLoad {
    dispatch_async(dispatch_get_main_queue(), ^{
    [self.tableView reloadData];
    });
}
9
user3730468

Wenn Sie die Tabelle nicht mit neu laden können

[self.tableView reloadData];

Stellen Sie sicher, dass Sie im Storyboard einen Verweis auf Folgendes hinzufügen

@property (weak, nonatomic) IBOutlet TableView *tableView;

Wie Sie einen Verweis hinzufügen, können Sie auf folgenden Image-Link klicken:

tableView Referenzausgang

2
ashish mankar

Das ist mir passiert, weil es einen Anruf gab

tableView.beginUpdates()

ohne zu rufen

tableView.endUpdates()

In meinem Code. Das Entfernen von tableView.beginUpdates() hat das Problem für mich behoben.

0
Menno

Ich habe Tage damit verbracht, dieses Problem zu debuggen und habe eine Menge möglicher Korrekturen gefunden. Ich habe die Rolle gespielt, die für mich funktioniert hat, aber sie sind alle gültig.

Überprüfen Sie zunächst natürlich, ob Ihr Delegat, Ihre Datenquelle, Ihr IBOutlet usw. ordnungsgemäß konfiguriert sind.

** Legen Sie den Haltepunkt Alle Ausnahmen fest und prüfen Sie, ob in Ihrer Datenquelle eine Out-of-Grenzen-Ausnahme auftritt. Ohne Setzen des Haltepunkts gibt es keinen Absturz, und der Tableview kann einfach nicht neu geladen werden.

Andere mögliche Korrekturen: Überprüfen Sie den Frame der Tableview, um sicherzustellen, dass Breite oder Höhe nicht 0 sind. Versuchen Sie, reloadData im Hauptthread auszuführen. Versuchen Sie zuletzt, nur einen einzelnen Abschnitt erneut zu laden ( hier ).

Liebe Tisch Ansichten.

0
Max Friedman

Trotz des Schreibens dieses [self.tableView reloadData];-Versuchs unten, da Sie bereits eine Klasse geschrieben haben, so dass Sie nicht noch einmal die Steckdose nehmen müssen: -

[self reloadData]
0
Hussain Shabbir