So löschen Sie eine Zeile aus UITableView
Ich versuche zu löschen, eine Zeile aus meiner Tabelle anzeigen und war bisher erfolglos. Ich bekomme immer diese Fehlermeldung:
"Terminating app due to uncaught exception
'NSInternalInconsistencyException', reason: 'Ungültiges update: ungültige
Anzahl der Zeilen im Abschnitt 0. Die Anzahl der Zeilen, die in einer
bestehenden Abschnitt nach dem update (5) muss gleich der Anzahl der
Zeilen in diesem Abschnitt, bevor Sie das update (5), plus oder minus
die Anzahl der Zeilen, die eingefügt oder gelöscht, der Abschnitt (0 eingefügt,
1 gelöscht).'" Das array, welches ich zum füllen der Tabelle Ansicht
deklariert, dass die Klasse, auch bekomme ich meine Objekte für mein array aus einer
sqlite db.
Den code, den ich verwendet, um zu versuchen, das löschen von Zeilen ist wie folgt.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
//Delete the row from the data source
[categoryArray objectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
}
else if (editingStyle == UITableViewCellEditingStyleInsert) {
//Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
Nun für die Fragen, die ich hoffe beantwortet zu bekommen:
-Wie kann ich Zeilen löschen, richtig?
-Werde ich vor dem löschen der Zeile, wenn der einzige linke in der tableView?
-Kann ich verändern, der tableView ist in die Methode zu sein, die UITableView als ich erklärte, dass in
meine .h-Datei?
Vielen Dank.
Bearbeiten
Voll .m-code
#import "DeleteCategoryTableView.h"
#import "KeyCryptAppAppDelegate.h"
@implementation DeleteCategoryTableView
@synthesize categoryArray;
#pragma mark -
#pragma mark Initialization
-(void) initializeCategoryArray {
sqlite3 *db= [KeyCryptAppAppDelegate getNewDBConnection];
KeyCryptAppAppDelegate *appDelegate = (KeyCryptAppAppDelegate *)[[UIApplication sharedApplication] delegate];
const char *sql = [[NSString stringWithFormat:(@"Select Category from Categories;")]cString];
sqlite3_stmt *compiledStatement;
if (sqlite3_prepare_v2(db, sql, -1, &compiledStatement, NULL)==SQLITE_OK)
{
while(sqlite3_step(compiledStatement) == SQLITE_ROW)
[categoryArray addObject:[NSString stringWithUTF8String:(char*) sqlite3_column_text(compiledStatement, 0)]];
}
else {
NSAssert1(0,@"Error preparing statement", sqlite3_errmsg(db));
}
sqlite3_finalize(compiledStatement);
}
/*
- (id)initWithStyle:(UITableViewStyle)style {
//Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
if ((self = [super initWithStyle:style])) {
}
return self;
}
*/
#pragma mark -
#pragma mark View lifecycle
- (void)viewDidLoad {
self.title = NSLocalizedString(@"Delete Categories",@"Delete your Categories");
categoryArray = [[NSMutableArray alloc]init];
[self initializeCategoryArray];
[super viewDidLoad];
//Uncomment the following line to display an Edit button in the navigation bar for this view controller.
self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
/*
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
}
*/
/*
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
}
*/
/*
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
}
*/
/*
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
}
*/
/*
//Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
//Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/
#pragma mark -
#pragma mark Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
//Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
//Return the number of rows in the section.
return [self.categoryArray count];
}
//Customize the appearance of table view cells.
- (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] autorelease];
}
//Configure the cell...
NSUInteger row = [indexPath row];
cell.text = [categoryArray objectAtIndex:row];
return cell;
}
/*
//Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
//Return NO if you do not want the specified item to be editable.
return YES;
}
*/
//Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
//Delete the row from the data source
[categoryArray removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
[deleteCategoryTable reloadData];
NSString *selectedCategory = [categoryArray objectAtIndex:indexPath.row];
sqlite3 *db= [KeyCryptAppAppDelegate getNewDBConnection];
KeyCryptAppAppDelegate *appDelegate = (KeyCryptAppAppDelegate *)[[UIApplication sharedApplication] delegate];
const char *sql = [[NSString stringWithFormat:@"Delete from Categories where Category = '%@';", selectedCategory]cString];
sqlite3_stmt *compiledStatement;
if (sqlite3_prepare_v2(db, sql, -1, &compiledStatement, NULL)==SQLITE_OK)
{
sqlite3_exec(db,sql,NULL,NULL,NULL);
}
else {
NSAssert1(0,@"Error preparing statement", sqlite3_errmsg(db));
}
sqlite3_finalize(compiledStatement);
}
else if (editingStyle == UITableViewCellEditingStyleInsert) {
//Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
/*
//Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
}
*/
/*
//Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
//Return NO if you do not want the item to be re-orderable.
return YES;
}
*/
#pragma mark -
#pragma mark Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//Navigation logic may go here. Create and push another view controller.
/*
<#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
//...
//Pass the selected object to the new view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
*/
}
#pragma mark -
#pragma mark Memory management
- (void)didReceiveMemoryWarning {
//Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
//Relinquish ownership any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
//Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
//For example: self.myOutlet = nil;
}
- (void)dealloc {
[super dealloc];
}
@end
InformationsquelleAutor der Frage seelani | 2010-12-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
1) Das problem mit dem löschen ist
Entfernen Sie es von der db auch.
Sobald Sie die Zeile löschen, laden Sie die tableView mit
[tableView reloadData]
2) ist Es kein problem, wenn nur ein Element
Edit:
Dies ist das problem
Die Sie gelöscht haben, den value-at indexPath.Zeile aus array nach, dass der Zugriff auf den Wert an der gleichen indexPath.Zeile, natürlich wird es löschen, wird der nächste Wert nur.. 🙂
So setzen, dass
NSString *selectedCategory = [categoryArray objectAtIndex:indexPath.row]
Linie vor
[categoryArray removeObjectAtIndex:indexPath.row];
InformationsquelleAutor der Antwort KingofBliss
Dies ist ALLE Sie tun müssen. Es kommt darauf an, implementieren Sie eine Methode ziemlich gut.
Swift 2
Swift 3
InformationsquelleAutor der Antwort Bartłomiej Semańczyk
Dein code ist in Ordnung, erwarten, dass
withRowAnimation:
nicht erwarten, dass ein BOOLESCHER Wert, sondern einUITableViewRowAnimation
Mitglied. ZB.UITableViewRowAnimationRight
zu lassen, schieben Sie auf der rechten Seite der Tabelle.Auch: Sie Holen das Objekt aus dem array, Sie müssen es löschen! Wenn Ihr ein mutable-array verwenden, können Sie
[categoryArray removeObjectAtIndex:indexpath.row]
InformationsquelleAutor der Antwort JustSid
zu diesem Zweck nicht versuchen, die Zeile löschen löschen von array-oder Datenquelle(im Fall der Arrays ist die Vorbereitung von Datenbank), dann versuchen neu zu laden array rufen Sie einfach die Funktion in der Datenbank.
dann
dies ist die richtige Praxis.
InformationsquelleAutor der Antwort Ishu
Lesen, was das problem von der Konsole ist.
Haben Sie eine Methode
numberOfRowsInSection
... können sagen, seinen Satz zureturn 5;
.Beim löschen einer Zeile aus der Tabelle anzuzeigen, müssen Sie auch aktualisieren, diese Methode... also Ihr auf der Suche für Sie zu
return 4;
aus dieser Methode.Grundsätzlich müssen Sie sicherstellen, dass die Nummer der Zeile in der Tabellenansicht ist EINE WENIGER als vor dem löschen die Zeilen.
InformationsquelleAutor der Antwort Thomas Clayson