繁体   English   中英

在数据源之前绘制的目标c表视图单元格

[英]objective c table view cell drawn before data source

我的UITableview单元格的数据源在:

- (void)connectionDidFinishLoading:(NSURLConnection *)conn {

    // We are just checking to make sure we are getting the XML 
    NSString *xmlCheck = [[[NSString alloc] initWithData:xmlData encoding:NSWindowsCP1252StringEncoding] autorelease];
   // NSLog(@"xmlCheck2 = %@", xmlCheck);

    TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:xmlData];
    for (int i=2; i<33; i++) {
        NSString *link=[NSString stringWithFormat:@"/html/body/table/tr[%d]/td",i];

        NSArray *elements = [xpathParser searchWithXPathQuery:link];

        NSString *date = [NSString stringWithFormat:@"%@, %@",[elements[5]text],[elements[1]text]];
        [times addObject:date];
        [names addObject:[elements[2]text]];
        [types addObject:[elements[3]text]];
        [places addObject:[elements[4]text]];

        NSLog(@"%@", elements);
        NSLog(@"%@", [elements[0] text]);
    }
}

但是,即使在我绘制单元格之前就已开始连接,绘制单元格的方法还是在连接完成之前被调用。 如何在绘制单元格之前延迟绘制单元格方法或确保连接完成?

仅在完成加载数据之后,才需要设置tableview的数据源和委托属性。 如果您已经从IB或Storyboard设置了tableview的委托和数据源,请将其删除。 完成加载数据后,设置tableview的委托和数据源属性。 并重新加载表。

- (void)connectionDidFinishLoading:(NSURLConnection *)conn {

    // We are just checking to make sure we are getting the XML 
    NSString *xmlCheck = [[[NSString alloc] initWithData:xmlData encoding:NSWindowsCP1252StringEncoding] autorelease];
   // NSLog(@"xmlCheck2 = %@", xmlCheck);

    TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:xmlData];
    for (int i=2; i<33; i++) {
        NSString *link=[NSString stringWithFormat:@"/html/body/table/tr[%d]/td",i];

        NSArray *elements = [xpathParser searchWithXPathQuery:link];

        NSString *date = [NSString stringWithFormat:@"%@, %@",[elements[5]text],[elements[1]text]];
        [times addObject:date];
        [names addObject:[elements[2]text]];
        [types addObject:[elements[3]text]];
        [places addObject:[elements[4]text]];

        NSLog(@"%@", elements);
        NSLog(@"%@", [elements[0] text]);
    }

    [tableView setDelegate:self];// set delegate, datasource & reload data.
    [tableView setDatasource:self];
    [tableView reloadData];
}

这就是异步网络的关键:)您的主线程不等待它完成! 同步在那里,但是很糟糕

让您的UI处理尚未提供数据的情况。

a)将tableview设置为隐藏,显示一个纺车,并在调用connectionDidFinish时显示并重新加载表

模拟代码

-viewWillAppear {  
    table.hidden = YES;  
    spinningActivity.hidden = NO;  
    networkConnection start];
 }

-connectionDidFinish {
    spinningActivity.hidden = YES;
    [table reloadData];
    table.hidden = NO; 
}

提供单元格信息的方法只有在您告诉它有准备显示的行时才被调用。 如果您在tableView:numberOfRowsInSection:告诉它正确的事情-如果连接未完成,则可能为0-不应对tableView:cellForRowAtIndexPath:进行任何不正确的调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM