UITableView refresh discussie in Ontwikkelen voor iOS forum; ( verdwijnt na registratie ) Ik ben bezig met een app met een UITableView die gerefresht wordt. Het refreshen doe ik met de pull-to-refresh techniek. Aan het eind van de ...
|
Registreer | FAQ | Ledenlijst | Kalender | Berichten van vandaag | Zoeken |
#1
|
|||
|
|||
UITableView refresh
Ik ben bezig met een app met een UITableView die gerefresht wordt. Het refreshen doe ik met de pull-to-refresh techniek. Aan het eind van de refresh heb ik een array gevuld met 'nieuwe' objecten. De vraag is: hoe krijg ik deze nieuwe objecten 'bovenop' de bestaande rijen in de tableview, terwijl de scrollview binnen de tableview qua positie hetzelfde blijft? Dit is terug te vinden in veel apps, zoals De Telegraaf (helemaal naar onder scrollen om meer artikelen te laden, artikelen worden aan de tableview gehangen, terwijl het scherm hetzelfde blijft) en Tweetie (of Twitter for iPhone). Echter ben ik er nog steeds niet achter hoe dit gedaan wordt. Weet iemand dit? Ik heb al geprobeerd scrollToRowAtIndexPath te gebruiken, maar dit geeft niet het gewenste effect. Bij voorbaat dank.
|
|
|
Gesponsorde links (verdwijnt na registratie)
|
#2
|
|||
|
|||
Ik neem aan dat je "[tableView reloadData]" aanroept om te verversen? dan ververst ie de hele tableview. Je moet de rows gewoon inserten:
Code:
[theTableView beginUpdates]; [theTableView insertRowsAtIndexPaths:indexPaths withRowAnimation:animation]; // make sure the dataSource will return new rows before calling endUpdates [theTableView endUpdates];
__________________
Software Engineer iPhone Developer |
#3
|
|||
|
|||
Je wilt aan de bovenkant nieuwe rijen toevoegen aan de tabel, terwijl de scrollpositie hetzelfde blijft?
Dan zou ik in ieder geval niet [tableView reload] gebruiken (als je dat al deed ) maar: Code:
- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation Probeer eens ook de scrollToRowAtIndexPath binnen de begin- en endUpdates te zetten. Wellicht dat het scrollen dan wel goed gaat. Alle API Info vind je natuurlijk hier. Heb ik je een beetje geholpen? Ik ga binnenkort aan een soortgelijke toepassing werken, dus ik ben benieuwd naar het resultaat (ik gebruik nu EGORefresh voor de pull-to-refresh en dat werkt feilloos)
__________________
Leon [iPhone- en Java ontwikkelaar] |
#4
|
|||
|
|||
Kijk, daar heb ik wat aan . Thanks voor jullie replies. Ik was al eerder aan het knoeien met insertRowsAtIndexPaths, maar heb het nog niet werkend gekregen. Eerst telkens een error met "NSMutableArray index .. beyond bounds". Die is opgelost door de datasource te wijzigingen tussen [self.tableView beginUpdates] en [self.tableView endUpdates]. Nu heb ik volgende code:
Code:
NSMutableArray *indexPaths = [[NSMutableArray alloc] init]; for(int i; i<[arrayWithNewObjects count];i++){ NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; [indexPaths addObject:indexPath]; } [self.tableView beginUpdates]; [dataSourceArray insertObjects:arrayWithNewObjects atIndexes:[NSIndexSet indexSetWithIndexesInRange:range]]; [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; [self.tableView endUpdates]; Code:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (170) must be equal to the number of rows contained in that section before the update (167), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted). ps: @wubbe: jup ik gebruik ook EGORefresh, werkt idd zonder problemen |
#5
|
|||
|
|||
Da's nou precies de melding waar ik je voor wilde waarschuwen.
0 inserted is inderdaad niet waar, maar tussendoor roept hij numberOfRowsInSection aan (zet er maar eens een debug-stopje in) en die geeft dan nog 0 terug. Vandaar dat ie denkt dat het niet klopt. Volgens mij moet je er voor zorgen dat voordat je endupdates aanroept alles goed staat zodat de methoden numberOfSections en numberOfRowsInSection de correcte getallen terug geven. Tip: zet NSLog()'s in numberOfRowsInSection en NumberOfSections. Dan zie je wanneer ze aangeroepen worden en wat ze terug geven. Daar zit nog iets fout. Ik heb daar zelf enorm mee lopen stoeien. Wel een hoop wijzer geworden maar ik heb het nog niet op een elegante manier opgelost. Geluk voor mij is het project even stopgezet. Na mijn vakantie, (in september dus) ga ik er weer mee verder. En dan staat hier natuurlijk dé oplossing |
#6
|
|||
|
|||
Helaas, deze app moet voor het eind van de zomervakantie af zijn . Dat wordt nog even zelf knoeien vrees ik. Het valt me trouwens op dat over dit onderwerp geen concreet voorbeeld op internet te vinden is, terwijl deze techniek in zoveel apps wordt gebruikt... (op internet zie ik dingen over contentoffset, scrollen, het inserten van rows; kortom: vanalles doorelkaar zonder dat iemand de juiste,werkende oplossing aangeeft).
|
#7
|
|||
|
|||
Ja, dat viel mij ook op. als je bijvoorbeeld naar 'Trein' kijkt, dan zie je dat Dennis Stevense dit principe echt heel goed voor elkaar had.
Er moet een vaste methode zijn waarmee je inserts en deletes van een tabel mooi met animaties kunt doen. Maar daar gaan we uitkomen En... je weet precies wat het probleem is. Dan is een stap naar de oplossing niet ver. |
#8
|
|||
|
|||
En ik ben weer een stapje verder . De crash is verdwenen en de rows worden geanimeerd in de tableview gegooid:
Code:
NSRange range = NSMakeRange(0,[arrayWithNewObjects count]); NSRange range2 = NSMakeRange((dataSourceArray-[arrayWithNewObjects count]),[arrayWithNewObjects count]); NSLog(@"RANGE: %@",NSStringFromRange(range)); NSLog(@"RANGE2: %@",NSStringFromRange(range2)); NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"Date" ascending:NO]; NSArray *sortDescriptors = [NSArray arrayWithObject:sortByName]; NSArray *sortedNewObjects; sortedNewObjects = [arrayWithNewObjects sortedArrayUsingDescriptors:sortDescriptors]; NSMutableArray *indexPaths = [[NSMutableArray alloc] init]; for(int i; i<[arrayWithNewObjects count];i++){ NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; [indexPaths addObject:indexPath]; } [self.tableView beginUpdates]; [dataSourceArray removeObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:range2]]; [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop]; [dataSourceArray insertObjects:sortedNewObjects atIndexes:[NSIndexSet indexSetWithIndexesInRange:range]]; [self.tableView endUpdates]; Laatst gewijzigd door DJ14; 08-07-11 om 23:14. Reden: toevoeging |
#9
|
|||
|
|||
GEWELDIG!!!111!! HET WERKT . Voor mensen die deze techniek ook willen gebruiken: het heeft niets te maken met insertRowsAtIndexPaths en deleteRowsAtIndexPaths maar met de contentOffset van de tableview. Globaal ziet het er zo uit:
Code:
-> actie: user heeft tableview naar beneden getrokken -> gevolg: refresh - array met nieuwe data vullen - [tableView reloadData] aanroepen - huidige contentOffset van tableview pakken - hoogte van nieuwe rijen berekenen (bij dynamische cel hoogte gebruik je [NSString sizeWithFont:constrainedToSize:lineBreakMode] - hoogte van nieuwe rijen optellen bij hoogte van huidige offset - dit getal toekennen aan self.tableView.contentOffset.y (self.tableView.contentOffset.x = 0) Laatst gewijzigd door DJ14; 09-07-11 om 11:49. |
#10
|
|||
|
|||
Mooi dat je hebt wat je wilt hebben. Je kunt het inderdaad met de contentOffset doen, maar met insertRowsAtIndexpathss is eigenlijk de juiste manier. Maar dat is inderdaad soms lastig voor elkaar te krijgen.
edit: Misschien heb je hier nog wat aan: Code:
[self.tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionBottom animated:false]; |
#11
|
|||
|
|||
Je gebruikt dus niet het 'geanimeerd' toevoegen van nieuwe rijen in je tabel?
|
#12
|
|||
|
|||
|
#13
|
|||
|
|||
Nou, dan moet ik het dus zelf uitzoeken
Fraai is dat Als ik het uitgepuzzeld heb dan meld ik dat wel hier. |
#14
|
|||
|
|||
Citaat:
Citaat:
|
Er zijn 1 actieve gebruikers die momenteel deze discussie bekijken (0 leden en 1 gasten) |
|
Soortgelijke discussies |
||||
Discussie | Auteur | Forum | Reacties | Laatste bericht |
Mail refresh 3.1.3 | JHommes | iPhone algemeen | 0 | 30-05-10 15:14 |
UITableView vraag | Dreissen | Ontwikkelen voor iOS | 4 | 15-04-10 15:58 |
Installer.app Refresh | Stefanboyy95 | Jailbreak apps en thema's | 0 | 28-03-08 23:43 |
installer refresh | daanenroy | Jailbreak apps en thema's | 11 | 23-02-08 21:18 |
can't refresh sources | Nikooos | Archief | 2 | 31-12-07 19:06 |
|
|