2012-12-28 4 views
8

Di seguito è riportata la funzione che sto utilizzando per ottenere e analizzare pagine diverse del feed.UITableView consente di inserire più righe mantenendo gli elementi già recuperati

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

Quando utente scorre fino al fondo di Tableview, a utilizzare la funzione sottostante per accedere alla seconda pagina di mangimi e così via incrementando il contatore:

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

Il problema è quando invece caricandolo sotto gli elementi già recuperati, ricarica la vista tabella per mostrare i nuovi elementi della pagina e quelli vecchi scompaiono. Voglio caricare nuovi elementi della pagina sotto quelli esistenti per avere scroll infiniti. Come lo posso fare?

risposta

2

Ci si sente male per rispondere alla tua domanda, ma prendendo l'aiuto di un altro forum, sono stato in grado di capire la risposta.

Il controller tableview non era sincronizzato con l'array mutabile, quindi ne ho creato un altro e aggiungo entrambi gli array.

Step1: ho creato una proprietà

@property (nonatomic, readonly) NSMutableArray *moreItems; 

Step2: inizializzato l'array in viewDidLoad prima di chiamare fetchEntries

moreItems = [[NSMutableArray alloc] init]; 

Fase 3: In connectionDidFinishLoading, ho aggiunti 'moreItems' nuovo array alla matrice precedente 'articoli'

[moreItems addObjectsFromArray:[channel items]]; 

Step4: Modificata la sorgente dati in n umberOfRowsInSection da

return [[channel items] count]; 

al nuovo array

return [moreItems count]; 

e poi in cellForRowAtIndexPath, ha utilizzato il nuovo array

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

Ogni volta che l'array ottiene un nuovo oggetto aggiunto si chiama questo

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

Qui YourDataSourceArray è la matrice da cui si sta impostando il valore del tuo fila Tableview/dati. YourTableView è il nome dell'oggetto TableView.

+0

lo so, ma non so come utilizzare questa funzione – Jessica

+0

appena modificato la mia risposta – spider1983

+0

lemme provare questo uno – Jessica

0

Ciò potrebbe essere dovuto al fatto che quando si ricevono i dati dal servizio Web che si sta aggiungendo nell'array che si sta utilizzando per popolare la tabella, in questo modo si avranno solo nuovi dati, ciò che si deve fare è avere per aggiungere i nuovi dati alla matrice (Make it Array Mutevole e aggiungere nuovi dati) e basta usare la seguente linea

[your_Table reloadData]; 

Spero che questo vi aiuterà.

+0

lo sto già facendo ma questa non è la soluzione al mio problema. Devo usare insertRowsAtIndexPaths ma non so come – Jessica

+0

vuoi che i tuoi nuovi dati siano sulla riga specifica. – superGokuN

+0

alla fine delle righe già recuperate – Jessica

1

È necessario utilizzare il metodo insertRowsAtIndexPaths: withRowAnimation: di UITableView.

Una cosa che dovete fare attenzione è che quando si utilizza questo metodo, le righe numero retuned da tableView:numberOfRowsInSection dovrebbero essere uguali a number_of_existing_rows + number_of_newly_inserted_rows

0

Invece di usare scorrendo verso il basso per caricare, meglio usare l'ultima fila di Tableview come " Carica più elementi "e quando l'utente ha selezionato quella riga, recupera il nuovo feed e ricarica la vista tabella.

E anche io ho un dubbio nel codice, ogni volta in modo getfeed, si sta creando serie
collectedData. Dubito che manchi di accodare questi dati ai dati delle origini dati della tabella, che possono causare la visualizzazione di dati di feed solo recenti in tableview. Controllare

+0

utilizzando tableviewfooter invece di scorrere verso il basso è anche una possibilità. Penso che in questo momento devo concentrarmi sul problema principale – Jessica

+0

no, questo è il codice predefinito dal modello masterdetail, aggiunge solo le righe in alto – Jessica

+0

Ciao, Controllare questo codice qui sotto. Per prima cosa è necessario inserire i dati nell'origine dati e creare la chiamata insertRowsAtIndexPaths: withRowAnimation. –

1

Dopo aver completato il recupero del nuovo feed per la pagina successiva, ottenere gli oggetti in una matrice. Aggiungi questi oggetti da questa matrice alla matrice di origini dati. Ora inserire righe alla tabella come segue:

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

dove "indexPathsToInsert" è array di oggetti NSIndexPath a partire dall'ultima fila nella tabella e containg indexPaths per i vostri nuovi oggetti.

Spero che questo aiuti.

1

Ciao,

Creare un ciclo for, con l'indice di partenza è (numero di oggetti in origine dati) e il numero di oggetti che si desidera aggiungere (conte), creare la serie di indexpaths e chiamare insertRowsAtIndexpaths: withRowAnimation.Spero che il codice ti aiuti.

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

lemme controlla anche questo – Jessica