【问题标题】:cellForRowAtIndexPath called too latecellForRowAtIndexPath 调用太晚了
【发布时间】:2010-06-17 16:45:07
【问题描述】:

每当我从网络上获得的一些数据可用时,我都会尝试重新加载表格。这就是我所拥有的:

搜索数据视图控制器: - (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]; } 实现的SearchViewController: - (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

任何想法为什么会出现这种行为?

谢谢!

【问题讨论】:

    标签: iphone uitableview ipad


    【解决方案1】:

    您是在问如何加载部分表格视图而不是整个内容?如果是这样,那么您可以为此目的使用 relaodRowsAtINdexPath: 或 reloadSectionsAtIndexPath,这是一个参考 TableView ref...

    【讨论】:

    • 没有。我的问题是 reloadData 只调用 numberOfRowsInSection,而不是 cellForRowAtIndexPath。当 kjeys 数组被填满时,在最后一次调用 numberOfRowsInSection 后,调用 cellForRowAtIndexPath。
    • 不确定我是否遵循,reloadData 会重新加载整个 tableview,因此首先会调用 numberOfRows,然后它会为所有行调用 cellForRowatIndexPath...
    • 就是问题所在,cellForRowatIndexPath 在 numberOfRowsInSection 被调用后没有被调用,它只有在我的 keys 数组被最后一个元素填充后才会被调用。我已经更新了原始帖子的最后一部分,以更好地解释这种情况。
    【解决方案2】:

    [self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:NO]; 更改为[self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:YES]; 解决了我的问题。

    【讨论】:

      【解决方案3】:

      问题在于您使用线程而不是“仅”打开或关闭标志。在不同的线程上执行选择器,它将开始工作。您也可以使用 performSelectorOnBackground

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-30
        相关资源
        最近更新 更多