Table 仅在滚动一次后查看显示实际数据的单元格

Table view cells showing actual data only after scrolling once

NSArray *sectionArray;
int sectionCount=0;
NSDictionary *orderedData;
NSString *checkInStr, *checkOutStr;
NSString *govtTaxes, *enhancementTotal, *grandTotal;

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupTable];

    [self.bookingsTableView reloadData];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

-(void)viewDidDisappear:(BOOL)animated {
    if(doesSendNotification){
        NSLog(@"summary view disappeared");
        [[NSNotificationCenter defaultCenter] postNotificationName:@"SummaryViewDismissedNotification" object:self];
    }
}

-(void)viewWillAppear:(BOOL)animated {
    [self.bookingsTableView reloadData];
}

-(void)setupTable {

    self.bookingsTableView.rowHeight = UITableViewAutomaticDimension;
    self.bookingsTableView.estimatedRowHeight = 50.0;
    sectionArray = [[SummaryModel sharedInstance] getTableSections:self.s_sendEnhancementServerDict];
    orderedData = [[SummaryModel sharedInstance] getOrderedData:self.s_sendEnhancementServerDict];

    [self.bookingsTableView reloadData];
}





#pragma mark- UITableview delegate and datasource methods

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    if(section==0){

        return 3;

    } else if (section>0 && section<(sectionCount-1)){
        int rows=(int)[[orderedData objectForKey:(NSString*)[sectionArray objectAtIndex:section]] count];
        return rows;

    } else {

        return 4;

    }
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

    return (NSString*)[sectionArray objectAtIndex:section];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {


    NSString *cellIdentifier;
    UITableViewCell *cell;

//    UITableView *table = (UITableView*)[self.view viewWithTag:11];
    if (indexPath.section==0 && indexPath.row>=0 && indexPath.row<=2) {

        cellIdentifier =@"SplitCell";
        cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }
        UILabel *l1 = (UILabel*)[cell viewWithTag:1];
        UILabel *l2 = (UILabel*)[cell viewWithTag:2];

        if(indexPath.row==0){
            l1.attributedText = [self getStyledString1:@"Hotel Name"];
            l2.attributedText = [self getStyledString:self.s_propertyName];
        } else if(indexPath.row==1){
            l1.attributedText = [self getStyledString1:@"Arrival Date:"];
            l2.attributedText = [self getStyledString:checkInStr];
        } else if(indexPath.row==2){
            l1.attributedText = [self getStyledString1:@"Departure Date:"];
            l2.attributedText = [self getStyledString:checkOutStr];
        }


    } else if (indexPath.section>0 && indexPath.section<(sectionCount-1)) {

        //        for(int i=0;i<5;i++){

        cellIdentifier=@"VerticalLabelCell";
        cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }
        UILabel *l3 = (UILabel*)[cell viewWithTag:3];
        UILabel *l4 = (UILabel*)[cell viewWithTag:4];
        l3.layer.backgroundColor = GOLDEN_COLOR.CGColor;

        NSArray *roomTypeArray = [orderedData objectForKey:(NSString*)[sectionArray objectAtIndex:indexPath.section]];
        NSDictionary *roomD = [roomTypeArray objectAtIndex:indexPath.row];

        NSString *header = [roomD objectForKey:@"room_type_name"];
        NSAttributedString *sH = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@" %@",header] attributes:@{NSFontAttributeName:ARIAL_FONT_BOLD}];
        l3.attributedText = sH;

        int roomCount = [(NSNumber*)[roomD objectForKey:@"room_units"] intValue];
        NSMutableAttributedString *labelText = [[NSMutableAttributedString alloc] init];
        for(int i=0;i<roomCount;i++){

            NSString *roomNo = [NSString stringWithFormat:@"\n Room # %d\n",i+1];
            NSAttributedString *s = [[NSAttributedString alloc] initWithString:roomNo attributes:@{NSFontAttributeName:ARIAL_FONT_BOLD, NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle)}];
            [labelText appendAttributedString:s];

            NSString *adults = [NSString stringWithFormat:@" Adults: %@ \t\t Max. Adults: %@ \n",[roomD objectForKey:@"max_adults"],[roomD objectForKey:@"max_adults"]];

            NSAttributedString *s1 = [[NSAttributedString alloc] initWithString:adults attributes:@{NSFontAttributeName:ARIAL_FONT_BOLD}];
            [labelText appendAttributedString:s1];

            NSArray *enhanc = [(NSArray*)[roomD objectForKey:@"room_features"] objectAtIndex:i];

            for(int i=0;i<[enhanc count];i++){
                [labelText appendAttributedString:[self getStyledString2:[NSString stringWithFormat:@" %@\n", [enhanc objectAtIndex:i]]]];
            }

            l4.attributedText = labelText;
        }


    } else if(indexPath.section==(sectionCount-1)){

        cellIdentifier =@"SplitCell";
        cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }
        UILabel *l1 = (UILabel*)[cell viewWithTag:1];
        UILabel *l2 = (UILabel*)[cell viewWithTag:2];

        if(indexPath.row==0){

            l1.attributedText = [self getStyledString1:@"Room Charges:"];
            l2.attributedText = [self getStyledString:[NSString stringWithFormat:@"£ %@", self.s_priceOfRooms]];
        }else if(indexPath.row==1){

            l1.attributedText = [self getStyledString1:@"Government Taxes:"];
            l2.attributedText = [self getStyledString:[NSString stringWithFormat:@"£ %@", govtTaxes]];
        }else if(indexPath.row==2){

            l1.attributedText = [self getStyledString1:@"Enhancement Total:"];
            l2.attributedText = [self getStyledString:[NSString stringWithFormat:@"£ %@", enhancementTotal]];
        }else if(indexPath.row==3){

            l1.attributedText = [self getStyledString1:@"Total Charges"];
            l2.attributedText = [self getStyledString:[NSString stringWithFormat:@"£ %@", grandTotal]];
        }



    }
    return cell;


}


-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    sectionCount = (int)[sectionArray count];
    return sectionCount;
}

-(void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {

    view.tintColor = GOLDEN_COLOR;

}

-(NSAttributedString*)getStyledString:(NSString*)input {
    NSAttributedString *str = [[NSAttributedString alloc] initWithString:input attributes:@{NSForegroundColorAttributeName:GOLDEN_COLOR, NSFontAttributeName:ARIAL_FONT}];
    return str;
}

-(NSAttributedString*)getStyledString1:(NSString*)input {
    NSAttributedString *str = [[NSAttributedString alloc] initWithString:input attributes:@{NSFontAttributeName:ARIAL_FONT_BOLD}];
    return str;
}

-(NSAttributedString*)getStyledString2:(NSString*)input {
    NSAttributedString *str = [[NSAttributedString alloc] initWithString:input attributes:@{NSFontAttributeName:ARIAL_FONT}];
    return str;
}

我制作了一个 ViewController 并在其中添加了一个 table 视图。一些数据填充在单元格中然后显示。 当我 运行 它时,最初我在我的单元格中看不到任何数据。但是当 table 视图滚动时,单元格开始显示实际数据。我不明白可能是什么原因。有什么指点吗???

我想动态调整单元格的大小,因为数据的大小可以是随机的。滚动一次后才显示数据。

setupTable 中,检查 sectionArrayorderedData 以确保它们不为空。在 setupTable 中添加断言,例如

sectionArray = [[SummaryModel sharedInstance] getTableSections:self.s_sendEnhancementServerDict];
orderedData = [[SummaryModel sharedInstance] getOrderedData:self.s_sendEnhancementServerDict];
NSAssert([sectionArray count] && [orderedData count], @"No data!"); // add this line
[self.bookingsTableView reloadData];

此问题与使用 UITableViewAutomaticDimension 有关,并且已在其他地方报告过。所以这行代码解决了我的问题:

-(void)viewDidAppear:(BOOL)animated {
    [self.tableView reloadData];
}

这只是在显示之前重新加载所有 table 部分和行。所以用户不会遇到空白行。参考:http://www.appcoda.com/self-sizing-cells/

您需要在主线程中使用reloadData (viewDidLoad)。你需要使用 dispatch_async喜欢下面的代码:

dispatch_async(dispatch_get_main_queue(), ^{
    [self.mytable reloadData];
}

Swift 5+ IOS 13 Xcode 11.2.1 + 惊人的答案

override func viewDidAppear(_ animated: Bool) {
    //  self.tablev.frame.origin.y = vnavigation.frame.maxY + 5
    //   tablevheight = self.tablev.frame.size.height
    self.bgview.backgroundColor = UIColor.init(patternImage: UIImage(named: "chat_bg.png")!)
    self.registerForKeyboardNotifications()
    UIView.performWithoutAnimation {
        tablev.beginUpdates()
        tablev.endUpdates()
    }
}