웹에서 가져온 일부 데이터를 사용할 때마다 테이블을 다시로드하려고합니다.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]; } ... }
내 문제는 내가 디버깅 할 때 키 배열이 마지막 데이터의 cellForRowAtIndexPath가 호출되는있는 시간이 가득 될 때까지 호출 reloadData 및 numberOfRowsInSection 사이를 이동한다는 것입니다 : 이것은 내가 무엇을 가지고 테이블 내가 보내 각 요소 하나 하나에 대한 업데이트하기
reloadData -> numberOfRowsInSection reloadData -> numberOfRowsInSection ... reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath
내가 원하는입니다 :
reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath ... reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath
어떤 아이디어 왜 이런 행동을?
감사합니다.
호에게 내 문제를 사용할 수 있습니다 work.You에 시작될 것입니다 reloadData는 cellForRowAtIndexPath가 아니라 numberOfRowsInSection 만 호출한다는 것입니다. kjeys 배열이 채워지면 numberOfRowsInSection이 마지막으로 호출 된 후 cellForRowAtIndexPath가 호출됩니다. –
잘 모르겠습니다. reloadData가 전체 tableview를 다시로드하므로 numberOfRows가 먼저 호출 된 다음 모든 행에 대해 cellForRowatIndexPath가 호출됩니다. – Daniel
numberOfRowsInSection이 호출 된 후 cellForRowatIndexPath가 호출되지 않으면 문제가 발생합니다. 내 키 배열이 마지막 요소로 채워진 후에 호출됩니다. 상황을 더 잘 설명하기 위해 원래 게시물의 마지막 부분을 업데이트했습니다. –