2012-03-07 13 views
10

Używam UITableViewController dla tabeli w mojej aplikacji i dodałem NSFetchedResultsController, aby podać dane do wyświetlenia w tabeli (ustawienie self jako delegata).Dodaj dodatkowy wiersz do UITableView zarządzanego przez NSFetchedResultsController

Jednak chciałbym dodać unikalną komórkę jako ostatnią komórkę tabeli, niezwiązaną z przedmiotami wyprodukowanymi przez predykat NSFetchedResultsController, chcę, aby ta komórka zawsze znajdowała się na dole tabeli.

Próbowałem po prostu dodaje 1 do tych metod w źródle danych widoku tabeli:

- (NSUInteger)numberOfSectionsInTableView:(UITableView *)sender 
{ 
    return [[self.fetchedResultsController sections] count] + 1; 
} 
- (NSUInteger)tableView:(UITableView *)sender numberOfRowsInSection:(NSUInteger)section 
{ 
    return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects] + 1; 
} 

A potem łapanie przypadek, w którym ten dodatkowy rząd jest generowany jak tak (tabela ma tylko 1 punkt) :

- (UITableViewCell *)tableView:(UITableView *)sender 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row == [self.fetchedResultsController.fetchedObjects count]) { 
     //Generate the last cell in table. 
    } else { 
     //Generate the rest of the cells like normal. 
    } 
    return nil; //To keep the compiler happy. 
} 

Spowoduje to sprawdzenie, czy indeks jest ostatnią komórką i czy zajmuje się nią prawidłowo.

Jednak ja wciąż otrzymuję następujący błąd w czasie wykonywania:

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

Każdy pomysł co jest przyczyną tego? Czy istnieje lepszy sposób dodawania dodatkowego wiersza do widoku tabeli kontrolowane przez NSFetchedResultsController?

Odpowiedz

13

Kontroler wyników pobranych jest ściśle związany z widokiem tabeli, jeśli wdrożono wszystkie metody źródeł danych, jak wskazano w dokumentacji (aktualizacje i tak dalej). Będzie dość brudny i hacki.

Czy Twój "dodatkowy rząd" może być zamiast tego widokiem stopki stołu? To zawsze będzie na dole. Nie byłoby to zbyt wielkim wysiłkiem, aby wyglądać jak komórka, chociaż z wyglądu chcesz, żeby wyglądała inaczej niż pozostałe komórki.

+0

Ach tak, to byłby o wiele lepszy sposób realizacji tego, dziękuję. (Najwyraźniej wciąż jestem nowicjuszem w programowaniu na iOS :-)) –

+0

Tak, to było bardzo hackowe. Ten pomysł jest tak prosty, jak wspaniały ...Wielkie dzięki! – Shingoo

+0

ale wygląda to tak - http://stackoverflow.com/questions/10965098/nsfetchedresultscontroller-prepend-a-row-or-section –

2

Biorąc pod stół ma tylko jeden odcinek, ten kod wygląda źle:

- (NSUInteger)numberOfSectionsInTableView:(UITableView *)sender 
{ 
    return [[self.fetchedResultsController sections] count] + 1; 
} 

Podejrzewam Twój katastrofy pojawia się, gdy próbuje pobrać tableview drugi odcinek; + 1 należy usunąć.

Możliwe jest wykonywanie bardziej skomplikowanych czynności przy tabelach pochodzących od pobranych kontrolerów wyników (zobacz NSFetchedResultsController prepend a row or section), więc jestem pewien, że ten prosty przypadek może zostać uruchomiony.

+0

Wciąż tableView: cellForRowAtIndexPath: będą nazywane [razy [self.fetchedResultsController]] razy. –

0

Dlaczego po prostu nie używasz wbudowanych widoków nagłówka i stopki widoku UITableView?

przykład:

UIView *customBottomView = [UIView alloc] init... //set up your View (what you called custom bottom cell)

self.table.tableFooterView = customBottomView; // alternatywnie tableHeaderView

Technicznie dodajesz widok, który jest wyświetlany poniżej (lub powyżej) tabeli dodanej do tabeli i obsługiwanej wspaniale przez TableView. Dla użytkowników nie ma możliwości określenia, czy jest to (ostatnia) komórka, czy po prostu widok. Będziesz musiał się obejść, jeśli planujesz używać metod takich jak didSelectRowAtIndexPath

Powiązane problemy