簡體   English   中英

cellForRowAtIndexPath調用為時已晚

[英]cellForRowAtIndexPath called too late

每當從網絡獲取的一些數據可用時,我都試圖重新加載表。 這就是我所擁有的:

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之間進行,直到keys數組中填充了最后一個數據,即cellForRowAtIndexPath的調用時間:

reloadData -> numberOfRowsInSection
reloadData -> numberOfRowsInSection
...
reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath

我想要的是表格針對我發送的每個元素進行更新,一個接一個:

reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath
reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath
...
reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath

任何想法為什么這種行為?

謝謝!

您是否在問如何加載整個表視圖的一部分? 如果是這樣,那么您可以為此目的使用relaodRowsAtINdexPath:或reloadSectionsAtIndexPath,這是參考TableView ref ...

[self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:NO]; [self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:YES]; 解決了我的問題。

問題出在您使用線程而不僅僅是“僅”打開或關閉標志。在不同線程上執行選擇器,它將開始起作用。您還可以使用performSelectorOnBackground

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM