uitableview headerViewForSection:始终返回nil

hta*_*oya 15 iphone uitableview ios

我有一个带有自定义标题视图的表,无论何时,或者我为部分选择了什么值,我总是得到零值.我有另一张表有同样问题的表.

如果我打印[tableview subviews]的值,我可以看到标题视图,但我不知道为什么该方法不会返回任何内容.

我要做的是获取headerview中的activityIndi​​cator并启动它或使用方法调用来停止它.

标题总是画好,但我无法获得参考.另外,调用headerViewForSection:不会调用委托方法,这是正常的吗?

footerViewForSection: 有同样的问题

一些代码:

- (UIView*) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

    NSArray* objs = [[NSBundle mainBundle] loadNibNamed:@"iPadTableCells" owner:nil options:nil];
    UIView* header = [objs objectAtIndex: 0];

    UIActivityIndicatorView* activityIndicator = (UIActivityIndicatorView*) [header viewWithTag:5];
    [activityIndicator startAnimating]

    return header;

}
Run Code Online (Sandbox Code Playgroud)

从任何方法:

    UIView* headerView = [tableview headerViewForSection: section];  //returns nil

    if (headerView) {
        UIActivityIndicatorView* activityIndicator = (UIActivityIndicatorView*)[headerView viewWithTag: 5];
        [activityIndicator stopAnimating];
    }
Run Code Online (Sandbox Code Playgroud)

Aar*_*ger 15

回答

来自文档:

要使表视图知道页眉或页脚视图,您需要注册它.您可以使用registerNib:forHeaderFooterViewReuseIdentifier:registerClass:forHeaderFooterViewReuseIdentifier:方法执行此操作UITableView.

(Swift等价物是 register(_:forHeaderFooterViewReuseIdentifier:).)

因此,您需要注册nib,然后使用重用标识符来获取它,而不是直接从应用程序包中提取它,这就是您现在正在做的事情.

...如果你想使用这个headerViewForSection方法.

替代答案

或者,您可以检查是否继续在viewForHeaderInSection方法内旋转,然后发送只是调用:

[self.tableView beginUpdates];
[self.tableView endUpdates];
Run Code Online (Sandbox Code Playgroud)

刷新节标题.

(请注意,这种替代方法会破坏并重新创建整个视图,因此如果您有一个包含大量数据的大表,那么它可能效率不高.)


sta*_*Man 9

自问这个问题以来已经有一段时间了,最​​近我遇到了类似的问题并且在这里问了我自己的问题: UITableView -headerViewForSection返回(null)
我相信我有答案.


先决条件步骤:

  1. 创建一个UITableViewHeaderFooterView子类并命名它CustomHeaderView
  2. 为类创建一个视图接口nib文件(显然你iPadTableCells在这里命名)
  3. 在xib中,选择View&in的Identity Inspector
    • 自定义类指定为CustomHeaderView
  4. 创建一个属性,合成并将其连接到xib
    • @property (strong, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;

使用以下代码:

- (UIView*) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    static NSString *HeaderIdentifier = @"header";
    CustomHeaderView *header = [tableView dequeueReusableHeaderFooterViewWithIdentifier:HeaderIdentifier];

    if(!header) {
        NSArray* objs = [[NSBundle mainBundle] loadNibNamed:@"iPadTableCells"
                                                      owner:nil
                                                    options:nil];
        header = [objs objectAtIndex: 0];
    }

    [header.activityIndicator startAnimating];
    return header;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样访问它:

CustomHeaderView *headerView = (CustomHeaderView*)[tableView headerViewForSection:section];
[headerView.activityIndicator stopAnimating];
Run Code Online (Sandbox Code Playgroud)


Kes*_*Xie 5

迅速

UITableViewHeaderFooterView您所需要做的就是为需要返回的标题视图创建一个实例

 func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let sectionHeaderView = UITableViewHeaderFooterView()
        //customize your view here
        return sectionHeaderView
    }
Run Code Online (Sandbox Code Playgroud)