2011-09-04 10 views
5

Próbuję uzyskać powiesić UITableViews i wszystko, co z tym związane. W tej chwili mam następujący kod:Aplikacja TableView została zakończona z powodu "NSInternalInconsistencyException"

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return 10; 
} 

-(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]; 
    } 

    [cell.textLabel setText:[NSString stringWithFormat:@"I am cell %d", indexPath.row]]; 

    return cell; 
} 

- (IBAction)killItem { 
    NSIndexPath *indexToDelete = [NSIndexPath indexPathForRow:2 inSection:0]; 
    [tbl deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexToDelete] withRowAnimation:UITableViewRowAnimationRight]; 
} 

I pojawia się następujący błąd podczas inicjowania „killItem” Funkcja:

kończące aplikację spowodowane nieprzechwyconego wyjątku „NSInternalInconsistencyException”, uzasadnienie: „Nieprawidłowy update: niepoprawna liczba wierszy w sekcji 0. Liczba wierszy zawartych w istniejącej sekcji po aktualizacji (10) musi być równa liczbie wierszy zawartych w tej sekcji przed aktualizacją (10), plus lub minus liczba wierszy wiersze wstawione lub usunięte z tej sekcji (0 włożonych, 1 usuniętych). "

Sposób, w jaki go rozumiem TableViews zasadniczo mają delegata i źródło danych, gdzie źródło danych, między innymi, określa, ile wierszy powinno być w tableView. Przez niektóre wyszukiwania tutaj w stackoverflow odkryłem, że ten błąd jest spowodowany, gdy "źródło danych nie pasuje do rzeczywistości", gdy szukają wierszy, które nie istnieją, które usunąłem.

Możliwe, że popełniłem błąd, ale to właśnie robię. Moje pytanie brzmi: jak mogę je dopasować, aby uniknąć tego błędu?

Dla porównania, szukałem w następujących stanowisk bez zrozumienia tego, co trzeba zrobić:

Error : Number of Rows In Section in UITableView in iPhone SDK

Slide UITableViewCell

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

Dodawanie [tbl reloadData], [tbl beginUpdate] ... [tbl endUpdate] w killItem funkcja, nie wydaje się pomóc mi w rozwiązaniu problemu.

Dziękuję z góry, Tobias Tovedal

Odpowiedz

12

całkiem proste, problem leży tutaj:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return 10; 
} 

Wzór delegat stosowany przez Apple, oznacza to, że jesteś odpowiedzialny na kierowanie treści UITableView poprzez swoich delegatów, co oznacza, że ​​jeśli usuwasz wiersz, jesteś także odpowiedzialny za usunięcie danych z modelu danych.

Po usunięciu wiersza miałoby sens, że liczba wierszy w sekcji zmniejszyłaby się do "9", jednak twoja funkcja zawsze zwraca 10, a zatem rzuca wyjątek.

Zazwyczaj podczas korzystania z tabeli, a zawartość będzie się zmieniać, NSMutableArray jest dość powszechne, można zrobić coś takiego:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [arrayWithStuff count]; 
} 

a następnie usunięcie obiektu (removeObjectAtIndex:) z tablicy będzie automatycznie zaktualizuj liczbę wierszy.

(Edit: Odpowiedział mniej więcej w tym samym czasie, co Mike Hay, spróbuj po jego rady zbyt pominąłem ten rozpoczęcia/zakończenia Update, ponieważ wydaje się, że już o tym przeczytać!)

+0

Dziękuję bardzo, że dobrze rozwiązałem mój problem! :RE –

12

Tobiasza, co trzeba zrobić, gdy usuwanie wierszy jest

// tell the table view you're going to make an update 
[tableView beginUpdates]; 

// update the data object that is supplying data for this table 
// (the object used by tableView:numberOfRowsInSection:) 
[dataArray removeObjectAtIndex:indexPath.row]; 

// tell the table view to delete the row 
[tableView deleteRowsAtIndexPaths:indexPath 
      withRowAnimation:UITableViewRowAnimationRight]; 

// tell the table view that you're done 
[tableView endUpdates]; 


Po wywołaniu endUpdate liczba wrócił z tableView:numberOfRowsInSection: musi być taka sama jak numer pod numerem beginUpdate minus liczba usuniętych wierszy.

+0

Dziękuję aswell Mike! :) –

Powiązane problemy