iOS UITableView以编程方式显示节标题

时间:2014-04-11 21:39:47

标签: ios objective-c cocoa-touch uitableview

我想以编程方式显示节标题。这就是我所拥有的。

- (void)refreshSectionHeader
{
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

-

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    if ([self shouldShowSectionHeader]) {

        UILabel *label = [[UILabel alloc] init];
        label.backgroundColor = [UIColor whiteColor];
        label.font = [label.font fontWithSize:15];
        label.text = @"It'sa me! Mario!";
        label.textAlignment = NSTextAlignmentCenter;

        return label;

    } else {
        return nil;
    }
}

-

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    if ([self shouldShowSectionHeader]) {
        return 20;

    } else {
        return 0;
    }
}

它几乎可以工作。当我拨打refreshSectionHeader时,标题会正确显示,但不会显示任何文字(标签)。只要我滚动tableView,就会出现文本。显然,我希望文本立即出现。任何想法如何解决这个问题?

此外,当shouldShowSectionHeader返回NO时,标题会正确消失。

3 个答案:

答案 0 :(得分:1)

好的,我找到了解决这个问题的3种方法。他们在这里。

您不必实施所有这三项。这3个中只有1个就足够了。

解决方案1是最好的imo。


1 - 在viewForHeaderInSection中,确保使用正确的框架初始化标签。另外,将它添加到UIView。返回UIView而不是UILabel。

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    if ([self shouldShowSectionHeader]) {

        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];
        label.backgroundColor = [UIColor whiteColor];
        label.font = [label.font fontWithSize:15];
        label.text = @"All your base are belong to us!";
        label.textAlignment = NSTextAlignmentCenter;

        UIView *sectionHeader = [[UIView alloc] init];
        [sectionHeader addSubview:label];

        return sectionHeader;

    } else {
        return nil;
    }
}

2 - 使用

- (void)refreshSectionHeader
{
    [self.tableView reloadSections:[[NSIndexSet alloc] initWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
}

而不是

- (void)refreshSectionHeader
{
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

3 - 以编程方式滚动tableview

- (void)refreshTableViewHeader
{
    [self.tableView beginUpdates];

    CGPoint contentOffset = self.tableView.contentOffset;
    contentOffset.y++;
    [self.tableView setContentOffset:contentOffset animated:NO];
    contentOffset.y--;
    [self.tableView setContentOffset:contentOffset animated:NO];    

    [self.tableView endUpdates];
}

答案 1 :(得分:0)

shouldShowTableViewHeader

添加自定义设置器
-(void)setShouldShowTableViewHeader:(BOOL)shouldShow
{
    _shouldShowTableViewHeader = shouldShow;
    [self refreshTableViewHeader];
}

请尽量为您的标签提供尺寸

UILabel *label = [[UILabel alloc] init];
label.backgroundColor = [UIColor whiteColor];
label.font = [label.font fontWithSize:15];
label.text = @"It'sa me! Mario!";
label.textAlignment = NSTextAlignmentCenter;
[label sizeToFit];

答案 2 :(得分:0)

您是否尝试过使用[self.tableView reloadData]代替

[self.tableView beginUpdates];
[self.tableView endUpdates];