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

我的UITableView在每个部分都有自定义的UIView标题。 我只需要刷新标题,而不是部分中的其他内容。 我试过[self.tableView headerViewForSection:i] ,它不会返回任何东西,即使它应该。 无论如何,我可以做到这一点?

编辑:基于新build议的代码

我已经给了这个镜头,它调用/更新该方法内的UIView,但更改不会直观地传播到屏幕上。

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

您不必调用setNeedsDisplay ,而是通过设置它的属性来自定义头。 当然,你必须得到表中的实际标题,不要调用委托方法,因为该方法通常会创build一个新的标题视图。

我通常在一个从tableView:viewForHeaderInSection:调用的小辅助方法中做到这一点。

例如:

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

为headerView创build自己的UIView的子类,并添加一些方法,以便你的视图控制器可以发送你想要的任何UI更新。

在创build自定义标题视图时,使用UITableViewHeaderFooterView而不是简单的UIView并在初始化它时使用如下所示:

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

reuseIdentifier会告诉你的UITableView跟踪标题,当你试图用[self.tableView headerViewForSection:i]访问它时,它不应该返回null

然后,您应该能够使用setNeedsDisplay上的UITableViewHeaderFooterView您从headerViewForSection进行修改后返回。

调用setNeedsDisplay仅用于触发接收视图的drawRect:方法。 除非这是你的文本颜色逻辑(也就是说,你正在用于标题视图的UIView子类的drawRect方法),否则没有什么可能改变。 您需要做的是直接调用标题视图上的某些内容,根据新的或更改的数据更新它们的状态,或直接访问标题视图中的标签,并在遍历它们时自行更改。 setNeedsDisplay只会触发在视图的drawRect:方法中find的代码。

我最近有这个确切的问题,只有当它们被创build时保持一个指向标题的指针才能克服它。 我在Swift中做了这个,只用了一个快速的字典types,但是这个想法可以以某种方式被按到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 }