2012-12-28 12 views
8

Poniżej znajduje się funkcja, której używam do pobierania i analizowania różnych stron kanału.UITableView Wstaw więcej wierszy zachowując już pobrane

- (void)getFeed:(NSInteger) pageNumber 
{ 
    collectedData = [[NSMutableData alloc] init]; 
    NSString *urlStr =[NSString stringWithFormat:@"http://sitename.com/feed/?paged=%d", pageNumber]; 
    NSURL *url = [NSURL URLWithString:urlStr]; 
    NSURLRequest *req = [NSURLRequest requestWithURL:url]; 
    conn = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES]; 
} 

Kiedy użytkownik przewija w dół do dna tableview, korzystać z funkcji poniżej, aby uzyskać dostęp drugą stronę kanału i tak dalej przez inkrementacji licznika:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height; 
    if (endScrolling >= scrollView.contentSize.height) 
    { 
     counter ++; 
     [self getFeed:counter]; 
    } 
} 

Problem jest, gdy zamiast ładując go poniżej już pobranych przedmiotów, odświeża widok stołowy, aby pokazać nowe elementy strony, a stare znikają. Chcę wczytać nowe elementy strony poniżej istniejących, aby mieć nieskończone przewijanie. Jak mogę to zrobić?

Odpowiedz

2

To jest złe odpowiedzieć na własne pytanie, ale biorąc pomoc z innego forum, udało mi się znaleźć odpowiedź.

Kontroler widoku tabeli nie był zsynchronizowany z tablicą zmiennych, więc utworzyłem drugą i dołączam obydwie tablice.

Krok 1: Stworzyłem właściwość

@property (nonatomic, readonly) NSMutableArray *moreItems; 

Krok 2: Initialised tablicę w viewDidLoad przed wywołaniem fetchEntries

moreItems = [[NSMutableArray alloc] init]; 

Krok 3: W connectionDidFinishLoading, i dołączony nowy tablicy 'moreItems' do poprzedniej tablicy "items"

[moreItems addObjectsFromArray:[channel items]]; 

Krok 4: Zmieniono źródło danych w n umberOfRowsInSection z

return [[channel items] count]; 

do nowej tablicy

return [moreItems count]; 

a następnie w cellForRowAtIndexPath, wykorzystał nową tablicę

RSSItem *item = [moreItems objectAtIndex:[indexPath row]]; 
1

Ilekroć macierzy dostaje nowy obiekt dodany nazywasz to

-(void)insertRowInTableView 
{ 
    int row = [YourDataSourceArray count]; 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0]; 
    NSArray *indexPaths = [NSArray arrayWithObject:indexPath]; 
    [YourTableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop]; 
} 

Tutaj YourDataSourceArray jest tablica z którego ustawiasz swoje count tableview wiersz/dane. YourTableView to nazwa twojego obiektu tableView.

+0

wiem, ale nie wiem, jak korzystać z tej funkcji – Jessica

+0

właśnie edytowanego Moja odpowiedź: – spider1983

+0

Proszę spróbować, proszę, ten jeden – Jessica

0

Może to być spowodowane tym, że gdy kiedykolwiek otrzymujesz dane z serwisu internetowego, dodajesz je do tablicy, której używasz do wypełnienia tabeli, dzięki temu będziesz mieć tylko nowe dane, co musisz zrobić, to masz dołączyć nowe dane do tablicy (Make it Zmienna Array i dołączanie nowych danych) i po prostu korzystać z następującą linię

[your_Table reloadData]; 

nadzieję, że to pomoże.

+0

już to robię, ale to nie jest rozwiązanie mojego problemu. Muszę używać insertRowsAtIndexPaths, ale nie wiem, jak – Jessica

+0

chcesz, aby twoje nowe dane były w określonym wierszu. – superGokuN

+0

na końcu już pobranych wierszy – Jessica

1

Powinieneś użyć metody insertRowsAtIndexPaths: withRowAnimation: z UITableView.

Jedno trzeba zadbać o to, że podczas korzystania z tej metody, wiersze numer retuned przez tableView:numberOfRowsInSection powinna być równa number_of_existing_rows + number_of_newly_inserted_rows

0

Zamiast przewijania w dół, aby załadować, lepiej skorzystać z ostatniego rzędu tableview jako " Załaduj więcej elementów "i gdy użytkownik wybierze ten wiersz, pobierz nowy kanał i załaduj ponownie tabelę.

A także mam jedną wątpliwość w twoim kodzie, za każdym razem w metodzie getfeed, tworzymy tablicę
collectedData. Wątpię, żebyś pomijał dołączanie tych danych do tabeli danych źródła danych, co może spowodować wyświetlenie tylko ostatnich danych z kanału w widoku tabeli. Sprawdź:

+0

przy użyciu tableviewfooter zamiast przewijania do dołu jest również możliwe. Myślę, że teraz muszę się skupić na głównym problemie – Jessica

+0

nie, jest to domyślny kod z szablonu masterdetail, po prostu dodaje wiersze na górze – Jessica

+0

Cześć, sprawdź poniższy kod. Najpierw należy wstawić dane do źródła danych i utworzyć wywołanie insertRowsAtIndexPaths: withRowAnimation. –

1

Po zakończeniu pobierania nowego kanału dla następnej strony pobierz obiekty z tablicy. Dodaj te obiekty z tej tablicy do swojej tablicy źródeł danych. Teraz wstawić wiersze do tabeli w następujący sposób:

[yourTable beginUpdates]; 
[yourTable insertRowsAtIndexPaths:indexPathsToInsert 
       withRowAnimation:UITableViewRowAnimationBottom]; 
[yourTable endUpdates]; 

gdzie „indexPathsToInsert” jest tablicą obiektów NSIndexPath począwszy od ostatniego wiersza w tabeli i zawierajacego indexPaths dla nowych obiektów.

Mam nadzieję, że to pomoże.

1

Cześć,

Tworzenie pętli for, z indeksem wyjścia jest (liczba obiektów w źródle danych) oraz liczba obiektów, które chcesz dodać (licznik), należy utworzyć tablicę indexpaths i nazywają insertRowsAtIndexpaths: withRowAnimation.Mam nadzieję, że ten kod ci pomoże.

NSInteger statingIndex = [self.tableViewDatasource count]; 
    NSInteger noOfObjects = //Get the no.of objects count from getFeed method. 
    NSMutableArray *indexPaths = [[NSMutableArray alloc] init]; 

    for (NSInteger index = statingIndex; index < statingIndex+noOfObjects; index++) { 

     [_objects addObject:]; // add the object from getFeed method. 
     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0]; 
     [indexPaths addObject:indexPath]; 
     [indexPath release]; 

    } 

    [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade]; 
+0

. Sprawdź też to – Jessica

Powiązane problemy