Я пытаюсь перезагрузить таблицу каждый раз, когда доступны некоторые данные, которые я получаю из Интернета. Это то, что у меня есть:cellForRowAtIndexPath называется слишком поздно
SearchDataViewController:- (void)parseDataXML { parsingDelegate = [[XMLParsingDelegate alloc] init]; parsingDelegate.searchDataController = self; // CONTAINS THE TABLE THAT NEEDS RE-LOADING; ImplementedSearchViewController *searchController = [[ImplementedSearchViewController alloc] initWithNibName:@"ImplementedSearchView" bundle:nil]; ProjectAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; UINavigationController *nav = (UINavigationController *)[delegate.splitViewController.viewControllers objectAtIndex: 0]; NSArray *viewControllers = [[NSArray alloc] initWithObjects:nav, searchController, nil]; self.splitViewController.viewControllers = viewControllers; [viewControllers release]; // PASS A REFERENCE TO THE PARSING DELEGATE SO THAT IT CAN CALL reloadData on the table parsingDelegate.searchViewController = searchController; [searchController release]; // Build the url request used to fetch data ... NSURLRequest *dataURLRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:dataURL]]; parsingDelegate.feedConnection = [[[NSURLConnection alloc] initWithRequest:dataURLRequest delegate:parsingDelegate] autorelease]; }
ImplementedSearchViewController:- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { NSLog(@"count = %d", [keys count]); // keys IS A NSMutableArray return [self.keys count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ... cell.textLabel.text = [keys objectAtIndex:row]; ... }
XMLParsingDelgate:-(void) updateSearchTable:(NSArray *)array { ... [self.currentParseBatch addObject:(NSString *)[array objectAtIndex:1]]; // RELOAD TABLE [self.searchViewController.table reloadData]; } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { if ([elementName isEqualToString:@"..."]) { self.currentParseBatch = [NSMutableArray array]; searchViewController.keys = self.currentParseBatch; ... } ... } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if ([elementName isEqualToString:@"..."]) { ... [self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:NO]; } ... }
Моя проблема заключается в том, что, когда я отладка, звонки идут между reloadData и numberOfRowsInSection, пока массив ключей не будет заполнен с последними данными, время, при котором cellForRowAtIndexPath вызывается:
reloadData -> numberOfRowsInSection reloadData -> numberOfRowsInSection ... reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath
То, что я хочу, чтобы таблица будет обновляться для каждого элемента шлю, один за другим:
reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath ... reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath
Любые идеи, почему это поведение?
Спасибо!
порядка № Моя проблема что reloadData вызывает только номерOfRowsInSection, а не cellForRowAtIndexPath. Когда массив kjeys заполняется, после того, как numberOfRowsInSection вызывается в последний раз, вызывается cellForRowAtIndexPath. –
не уверен, что я следую, reloadData перезагружает весь вид таблицы, поэтому сначала будет вызван номерOfRows, а затем он вызовет cellForRowatIndexPath для всех строк ... – Daniel
В этом проблема, cellForRowatIndexPath не вызывается после вызова numberOfRowsInSection, она получает только вызванный после того, как мой массив ключей был заполнен последним элементом. Я обновил последнюю часть своего оригинального сообщения, чтобы лучше объяснить ситуацию. –