2011-01-12 9 views
0

Ich bin gerade dabei, ein einfaches Tabellenansicht Beispiel für das iPhone zu schreiben, aber für das Leben von mir kann ich nicht herausfinden, warum die folgende Ausnahme auftritt.UITableView mit Core Data insertRowsAtIndexPaths verursacht NSInternalInconsistencyException

Der Arbeitsablauf ist wie folgt: Ich habe einen UIViewController, dem ich eine UIView hinzufügen. Um diese Ansicht dann bin ich eine Zugabe programmatisch definiert UITableView

- (id)init{ 
    [super initWithNibName:nil bundle:nil]; 

    tableView = [[UITableView alloc] initWithFrame:CGRectMake(20, 180, 280, 180) style:UITableViewStyleGrouped]; 
    tableView.backgroundColor = [UIColor redColor]; 
    tableView.delegate = self; 

    return self; 
} 

Sobald dies abgeschlossen ist, ich ein UITableViewDelegate verwende und die folgende Methode zu überschreiben, die meine Tabelle bearbeitet werden dazu führen sollte. Dies wird durch eine Taste und eine Auswahlmethode

- (void)editList:(id)sender{ 
    [self setEditing:YES animated:YES]; 
    [editButton addTarget:self action:@selector(doneList:) forControlEvents:UIControlEventTouchUpInside]; 
    [editButton setBackgroundImage:[UIImage imageNamed:@"ApplyChanges.png"] forState:UIControlStateNormal]; 
} 

ausgelöst Es gibt eine andere Methode namens doneList, die nach Abschluss ausgelöst werden, aber der Code ist nicht so weit zu bekommen. Sobald also auf die Schaltfläche geklickt wird, wird mein Delegat von setEditing aufgerufen und der Fehler wird ausgelöst. Hier

ist die delegierte Methode

- (void)setEditing:(BOOL)flag animated:(BOOL)animated { 
    NSLog(@"setEditing"); 
    // Always call super implementation of this method, it needs to do some work 
    [super setEditing:flag animated:animated]; 
    // We need to insert/remove a new row in to table view to say "Add New Item..." 
    if (flag) { 
     // If entering edit mode, we add another row to our table view 
     int count = entries.count; 
     NSLog(@"int: %i", count); 
     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:count inSection:0]; 
     [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];  
    } else { 
     // If leaving edit mode, we remove last row from table view 
     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[entries count] inSection:0]; 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight]; 
    } 
} 

Paar Dinge über dieses Stück Code während der Ausführung: 1) Zunächst wird die „Einträge“ Array ist leer, so dass die Anzahl 0 ist, die eine nicht null zurückzukehren scheint indexPath Objekt 2) Wenn die Einträge erhöht sich die Anzahl korrekt mit falschen Daten gefüllt werden, aber der Fehler immer noch auftritt 3) ich habe versucht, den Super setEditing Anruf zu entfernen und Fehler immer noch auftritt

und schließlich ist hier der Fehler.

2011-01-12 16:46:13.623 Book[6256:40b] numberOfRowsInSection 
2011-01-12 16:46:13.625 Book[6256:40b] numberOfRowsInSection 
2011-01-12 16:46:17.658 Book[6256:40b] setEditing 
2011-01-12 16:46:17.659 Book[6256:40b] int: 0 
2011-01-12 16:46:17.660 Book[6256:40b] *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1447.6.4/UITableView.m:976 
2011-01-12 16:46:17.692 Book[6256:40b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (0) must be equal to the number of rows contained in that section before the update (0), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted).' 

Bitte lassen Sie mich wissen, ob es etwas offensichtlich ist mir fehlt, ist es möglich, dass ich einen anderen Delegatmethode umfassen müssen, dass ich nicht bewusst bin?

+1

Sind Sie sicher, dass Sie entries.count möchten, wenn Sie auf Null basierende in der Reihe Array sind? – joshpaul

Antwort

0

Ok fand es heraus Leute. Es scheint, dass bei Verwendung eines benutzerdefinierten UIViewController, der ein UITableViewDelegate setzt, auch ein UITableViewDataSource-Set erforderlich ist und die tableViews dataSource auf self verweist.

Beispielcode.

Alter Code

// Header File 

@interface MyViewController : UIViewController <UITableViewDelegate> { 

} 

// Main File 

- (id)init{ 
    [super initWithNibName:nil bundle:nil]; 

    tableView = [[UITableView alloc] initWithFrame:CGRectMake(20, 180, 280, 180) style:UITableViewStyleGrouped]; 
    tableView.backgroundColor = [UIColor redColor]; 
    tableView.delegate = self; 

    return self; 
} 

Aktualisiert Arbeits Code

// Header File 

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> { 

} 

// Main File 

- (id)init{ 
    [super initWithNibName:nil bundle:nil]; 

    tableView = [[UITableView alloc] initWithFrame:CGRectMake(20, 180, 280, 180) style:UITableViewStyleGrouped]; 
    tableView.backgroundColor = [UIColor redColor]; 
    tableView.delegate = self; 
    tableView.dataSource = self; 

    return self; 
} 
Verwandte Themen