簡體   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