iCulture forum | iPhone, iPad,  iPod touch, Apple TV en iOS

iCulture forum | iPhone, iPad, iPod touch, Apple TV en iOS (https://forum.iculture.nl/)
-   Ontwikkelen voor iOS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/)
-   -   Table cells 'on top' laden... (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/40024-table-cells-on-top-laden.html)

Graaf 19-07-09 23:37

Table cells 'on top' laden...
 
Het was alweer eventjes geleden dat ik met de SDK bezig was, maar onlangs alles weer even opgepakt om wat projecten weer nieuw leven in te blazen.

Nou zie je in veel twitter clients, dat ze met een timer telkens nieuwe berichten ophalen, en als deze er dan zijn worden ze bovenaan de tablelist toegevoegd. ( nee ik ben niet de zoveelste twitter client aan het maken )

Nou vraag ik me dus af, hoe zorg ik ervoor dat de table cells die ik maak bovenop toegevoegd worden ipv onderaan.??

Iemand een idee?

Matisse 20-07-09 01:30

Is dat niet gewoon met insertRowsAtIndexPaths:withRowAnimation: en daarbij een indexPath meegeven met een row=0?

Myrdhin 20-07-09 17:22

Bij het weergeven van een tablelist kan je de data uit willekeurige bronnen halen. Als je b.v de nieuwe items aan het begin van je array toevoegd en die array gebruikt om je tablelist weer te geven al de list ook zo eruit zien als de array die je gebruikt.

Graaf 22-07-09 18:49

Ik heb nog niet helemaal voorelkaar wat ik wil.

Ik heb nu een timer die om de 30 secondes een API call doet naar m'n server en daar een NSDictionary van terug krijgt.
Dit voeg ik toe aan een NSArray, die dus steeds groter wordt, en deze NSArray wordt ook gebruikt om de table te vullen. Na het bijvoegen in de NSArray roep ik de tableView reloadData aan, en de tableView wordt ververst/nieuwe cellen komen onderin.

Ik zit er dus mee dat de volgorde totaal niet klopt, want hij zet de nieuwe records telkens onderin erbij. Doe ik een reverseObjectEnumerator op de data die ik terug krijg om de volgorde om te keren dan klopt er ook niks van omdat de nieuwe results dan ene keer onderop , daarna weer bovenop toegevoegd worden.

Bestaat er niet een methode om gewoon een losse cell zo pats, bovenin de table te plaatsen?
Want met reloadData wordt het natuurlijk op een gegeven moment reeete traag als je em maar blijft vullen.

Matisse 22-07-09 20:16

Citaat:

Oorspronkelijk geplaatst door Graaf (Bericht 328067)
Bestaat er niet een methode om gewoon een losse cell zo pats, bovenin de table te plaatsen?

insertRowsAtIndexPaths:withRowAnimation:

Graaf 22-07-09 20:33

Citaat:

Oorspronkelijk geplaatst door Matisse (Bericht 328104)
insertRowsAtIndexPaths:withRowAnimation:

Hier ben ik inmiddels ook al eventjes mee aan het stoeien, maar heb het nog niet werkend..

dit is wat ik doe, _messagesList is een NSMutableDictionary
Code:

NSDictionary *messages = [result objectForKey:@"results"];
for (NSDictionary *message in messages) {
  [_messagesList addObject: message];
  [[self tableView] insertRowsAtIndexPaths:[NSDictionary dictionaryWithObjects:[NSIndexPath indexPathForRow:[_messagesList count]-1 inSection:0]]];
}

dit is wat ik krijg: *** -[NSCFDictionary addObject:]: unrecognized selector sent to instance 0xd21dd0

danielpunt 22-07-09 20:48

weet je zeker dat de _messagesList geen NSCFDictionary is? Of in iedergeval niet nil is?

Graaf 22-07-09 20:52

Citaat:

Oorspronkelijk geplaatst door danielpunt (Bericht 328130)
weet je zeker dat de _messagesList geen NSCFDictionary is? Of in iedergeval niet nil is?

yes. _messagesList is zekerweten een NSMutableDictionary, en hij is niet nil.

Graaf 22-07-09 21:16

_messagesList heb ik nu een NSMutableArray van gemaakt, omdat NSMutableDictionary volgens mij niet helemaal goed werkte met addObject e.d.

Code:

        _messagesList = [result objectForKey:@"results"];
        NSMutableArray *insertIndexPaths = [[NSMutableArray alloc] init];
        for (NSUInteger i = 1; i <= [_messagesList count]; ++i) {
            [insertIndexPaths addObject:[NSIndexPath indexPathForRow:(i-1) inSection: 0]];
        }
       
        [self.tableView beginUpdates];
        [self.tableView insertRowsAtIndexPaths:insertIndexPaths    withRowAnimation: UITableViewRowAnimationRight];
        [self.tableView endUpdates];
        [insertIndexPaths release];

Dit geeft nu alleen:

'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (20) must be equal to the number of rows contained in that section before the update (20), plus or minus the number of rows inserted or deleted from that section (20 inserted, 0 deleted).'

Ik snap er werkelijk waar niks meer van.
Ik neem letterlijk methodes over uit examples / stukken source uit andere apps, maar krijg het niet werkend.

Whacko 24-07-09 11:40

Zo te zien voert ie bij het toevoegen een [tableview reloadData] uit ofzo. Hij roept dan opnieuw je

Code:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
method aan.

Waarschijnlijk geeft deze nog je oude waarde terug (het aantal rows voor het toevoegen). Deze moet je dus ook even ophogen (tellertje bijhouden ofzo?).


EDIT: typefoutjes

Matisse 24-07-09 13:31

1 Bijlage(n)
Ik heb even snel een voorbeeldappje gemaakt, mss kan je dat helpen...

S¡mon 24-07-09 14:24

Sorry, beetje offtopic:
Ik kan zelf PHP en het is best wel grappig om te zien wat jullie maken. Het gekke is, ik snap wel wat er gebeurd enzo en wat je doet maar als ik het zelf moest maken had ik geen idee waar te beginnen.

Graaf 24-07-09 21:28

Het is allemaal gelukt uiteindelijk. Thanx guys.
Ben met paar dingen maar even opnieuw begonnen, de afgelopen nacht doorgewerkt tot vanmorgen uurtje of 10 en het prototype van m'n nieuwe app is klaar :D

Het probleem lag denk ik uiteindelijk met het doorgelkaar halen van NSMutableDictionary en NSMutableArray schat ik zo...


Alle tijden zijn GMT +2. Het is nu 19:39.