仅刷新UITableView中的自定义标题视图?

时间:2014-05-06 18:12:36

标签: ios objective-c uitableview

我的UITableView在每个部分都有自定义UIView标头。我只需要刷新标题而不是该部分中的其他内容。我已经尝试了[self.tableView headerViewForSection:i]并且即使它应该也没有返回任何内容。无论如何,我能做到吗?

编辑:基于新建议的代码

我也给了它一个镜头,它在该方法中调用/更新UIView,但是这些更改不会在视觉上传播到屏幕上。

for (int i = 0; i < self.objects.count; i++) {
    UIView *headerView = [self tableView:self.tableView viewForHeaderInSection:i];
    [headerView setNeedsDisplay];
}

7 个答案:

答案 0 :(得分:19)

不要调用setNeedsDisplay,而是通过设置它的属性来自行配置标头。当然,您必须获取表中的实际标头,不要调用委托方法,因为该方法通常会创建新的标头视图。

我通常在一个从tableView:viewForHeaderInSection:调用的小辅助方法中执行此操作。

e.g:

- (void)configureHeader:(UITableViewHeaderFooterView *)header forSection:(NSInteger)section {
    // configure your header
    header.textLabel.text = ...
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UITableViewHeaderFooterView *header = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"Header"];
    [self configureHeader:header forSection:section];
}

- (void)reloadHeaders {
    for (NSInteger i = 0; i < [self numberOfSectionsInTableView:self.tableView]; i++) {
        UITableViewHeaderFooterView *header = [self.tableView headerViewForSection:i];
        [self configureHeader:header forSection:i];
    }
}

答案 1 :(得分:2)

为headerView创建自己的UIView子类,并为其添加几个方法,以便您的视图控制器可以发送您想要的任何UI更新。

答案 2 :(得分:1)

调用setNeedsDisplay仅用于触发接收视图的drawRect:方法。除非这是你的文本颜色逻辑所在的地方(也就是你在用于标题视图的UIView子类的drawRect方法中),否则什么都不会改变。您需要做的是直接调用标题视图上的内容以根据新的或更改的数据更新其状态,或直接访问标题视图中的标签并在迭代它们时自行更改。 setNeedsDisplay只会触发在视图的drawRect:方法中找到的代码。

答案 3 :(得分:1)

我最近遇到了这个问题,只是通过在创建标题时保留指针来克服它。我在Swift中使用了一个快速的字典类型,但这个想法可以用某种方式按摩到objC中。

  var headers : [ Int : UIView ] = [ : ] //dictionary for keeping pointer to headers

    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

        if let h = super.tableView(tableView , viewForHeaderInSection: section) { //or create your view (this viewController inherits it)..
        self.headers.updateValue(h , forKey: section) //keep a pointer to it before you return it..
        return h
        }
        return nil
    }

答案 4 :(得分:0)

创建自定义标题视图时,请使用UITableViewHeaderFooterView而不是简单的UIView,并在初始化时使用以下内容:

UITableViewHeaderFooterView *cell = [[UITableViewHeaderFooterView alloc] initWithReuseIdentifier:@"reuseIdentifier"];

reuseIdentifier会告诉您的UITableView跟踪标题,当您尝试使用null

访问标题时,它不应再返回[self.tableView headerViewForSection:i]

您应该可以在进行修改后setNeedsDisplay UITableViewHeaderFooterView使用headerViewForSection

答案 5 :(得分:0)

迅速5 解决方案:

表视图的委托方法:

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    // Ideally, dequeue your header view...
    var view: UITableViewHeaderFooterView?
    if section == 0 { view = ... // dequeue appropriately
    } else if section == 1 { view = ... // dequeue appropriately
    } else ... // etc.

    setupHeaderView(&view)
    return view
}

在您要执行标题视图更新的代码区域:

var headerView = tableView.headerView(forSection: i)
setupHeaderView(&headerView)

标题设置方法:

func setupHeaderView(_ view: inout UITableViewHeaderFooterView?) {
    // do something with `view` here
}

答案 6 :(得分:0)