uitableview headerViewForSection:始终返回nil

时间:2013-03-05 18:49:40

标签: iphone ios uitableview

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

如果我打印[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;

}

从任何方法:

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

    if (headerView) {
        UIActivityIndicatorView* activityIndicator = (UIActivityIndicatorView*)[headerView viewWithTag: 5];
        [activityIndicator stopAnimating];
    }

3 个答案:

答案 0 :(得分:15)

答案

来自文档:

  

要使表格视图能够识别页眉或页脚视图,您需要注册它。您可以使用registerNib:forHeaderFooterViewReuseIdentifier:的{​​{1}}或registerClass:forHeaderFooterViewReuseIdentifier:方法执行此操作。

(Swift等价物为UITableView。)

所以你需要注册nib,然后使用重用标识符来获取它,而不是直接将它从应用程序包中拉出来,这就是你现在正在做的事情。

...如果您想使用register(_:forHeaderFooterViewReuseIdentifier:)方法。

替代答案

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

viewForHeaderInSection

刷新章节标题。

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

答案 1 :(得分:9)

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


先决条件步骤:

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

  5. 使用以下代码:

    - (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;
    }
    

    然后您可以这样访问它:

    CustomHeaderView *headerView = (CustomHeaderView*)[tableView headerViewForSection:section];
    [headerView.activityIndicator stopAnimating];
    

答案 2 :(得分:4)

在swift中

您只需为需要返回的标题视图创建UITableViewHeaderFooterView的实例

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