【问题标题】:tableView.tableHeaderView being set but not drawntableView.tableHeaderView 已设置但未绘制
【发布时间】:2010-08-06 15:54:16
【问题描述】:

每当我设置我的 tableHeaderView 时,我都没有在模拟器中看到它。 如果我将它添加为子视图,它最终会被绘制在节标题下方。知道我在这里缺少什么吗?

我确实有一个 XIB 文件。我在 IB 中没有看到任何影响 headerViews 的属性。

- (void)viewDidLoad {   
[super viewDidLoad];
MyTitleView *titleView = [[MyTitleView alloc] initWithFrame:CGRectMake(60,0,260,40)];
titleView.label.text = @"My Title";
self.navigationItem.titleView = titleView;
[titleView release];

StandardTableHeaderView *headerView = [[StandardTableHeaderView alloc] initWithFrame:CGRectMake(0,0,320,44)];
self.tableView.tableHeaderView = headerView;
//  [self.view addSubview:self.tableView.tableHeaderView];
//  [headerView release];


NSLog(@"Header: %@",self.tableView.tableHeaderView); //Logs ] Header:     <StandardTableHeaderView: 0x5a508b0; frame = (0 0; 320 44); layer = <CALayer: 0x5a51130>>

编辑: StandardTableHeaderView.m 初始化方法:

- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
    self.backgroundColor = [UIColor redColor];
    self.label = [[UILabel alloc] initWithFrame:CGRectMake(frame.origin.x,0,frame.size.width,frame.size.height)];
    self.label.backgroundColor = [UIColor clearColor];
    self.label.textColor = [UIColor whiteColor];
    self.label.font = [UIFont fontWithName:@"Helvetica" size:16];
    [self addSubview:self.label];
}
return self;
}

【问题讨论】:

    标签: iphone xcode uitableview


    【解决方案1】:

    注意!如果您希望表格视图为您设置标题视图的框架,那您就错了,会得到非常奇怪的结果。

    我将我的设置为CGRectZero,以为它会自行解决,但它不会出现,当它出现时,它会出现在导航栏下方或插入第一个单元格等。

    【讨论】:

      【解决方案2】:

      首先你的代码看起来不错。

      2 个可能的问题:

      • self.tableView 未设置
      • tableHeaderViewviewDidLoad 之后被覆盖

      【讨论】:

      • 我的 tableView 已设置 -- 单元格运行正常,日志显示 tableHeaderView 框架正常。我没有在其他任何地方更改 tableHeaderView.. 可能有些奇怪,应该复制到一个新项目中?
      • 现在我将尝试调整 tableview 的大小并将 Header View 添加为单独的视图..
      • 您如何检查 tableView 属性是否已设置(不是 nil)?绘制单元格的事实并不一定说明 tableView 属性不为零...尝试在 self.tableView.tableHeaderView = headerView; 之后添加 NSLog(@"self.tableView = %@, self.tableView.tableHeaderView = %@", self.tableView, self.tableView.tableHeaderView); viewDidLoad 并查看您在日志中得到的内容...
      • 就我而言,我得到了:self.tableView = ; contentOffset: {0, 0}>, self.tableView.tableHeaderView = > 但仍未显示
      • @Farini,也许表格视图标题已设置但未绘制。这是我回答中的第二种情况。尝试在设置标题视图后立即调用[self.tableView reloadData];...
      【解决方案3】:

      我遇到了同样的问题,并注意到如果我通过调用初始化表视图,我在 NIB 中定义的任何 tableViewHeader 都不会出现:

      - (id)initWithStyle:(UITableViewStyle)style
      

      但是当我使用以下方法初始化我的 tableview 时,它毫不费力地神奇地出现了:

      - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
      

      很奇怪。

      【讨论】:

      • 当您使用 initWithNibName: 时,您的所有 NIB 信息(如 tableHeaderView)将从您指定的 NIB 加载。这可能就是它“神奇地出现”的原因:)
      【解决方案4】:

      我尝试将tableHeaderView 的设置放在ViewDidLoadloadView 方法中 - 它不起作用:视图的一部分是白色的,完全不可见。然后我试着把它放到ViewDidAppear 并且它起作用了:

      - (void)viewDidAppear:(BOOL)animated
      {
        [super viewDidAppear:animated];
      
        [self setupTableHeaderView];
      }
      

      【讨论】:

      • 这对我也有用...但是为什么呢?我有其他 Xcode 项目,我在viewDidLoad 中设置了表头视图,一切正常......嗯。无论如何,谢谢:)
      【解决方案5】:

      我在 viewDidLoad() 中遇到了同样的问题,它在 iPhone 11 Pro 的模拟器中工作,但不适用于 iPhone 8。将其移至 viewDidAppear() 解决了问题,但我最终将其移至 viewDidLayoutSubviews(),我认为这是最适合它的地方 - 在所有 iPhone 型号的模拟器中都能完美运行。

      override func viewDidLayoutSubviews() {
      
          let headerView = Bundle.main.loadNibNamed("HeaderView", owner: self, options: nil)?.first as? UIView
          headerView!.frame = CGRect(x: 0, y: 0, width: table_view!.frame.width, height: 160.0)
          tableView!.tableHeaderView = headerView
      }
      

      【讨论】:

        【解决方案6】:

        我遇到了一个问题,我将一个视图作为标题放在 tableviewcontroller 中,当我运行应用程序时它不会显示,问题是我在没有原型单元格时添加了标题。如果您添加至少一个原型单元格,然后在其上方添加标题,然后删除该单元格(如果需要),它将正确注册为标题视图

        【讨论】:

          【解决方案7】:

          当您在情节提要的 UITableView 中进行 UIView 并尝试设置 tableView.tableHeaderView = YOUR_VIEW 时,它将不起作用。您必须首先将该视图拖放到视图控制器之外创建其插座,然后设置

          tableView.tableHeaderView = YOUR_VIEW

          【讨论】:

            【解决方案8】:

            根据 Kalle 的关键线索,我添加了这个

            open var intrinsicContentheight: CGFloat
            {
                achievementLabel.sizeToFit()
                let labelSize = achievementLabel.bounds.size
                return labelSize.height + 13 + .verticalMargin
            }
            

            对定义标题视图的类感到厌恶。 如果你没有动态类型,你会有一个更简单的方法。

            这是视图控制器中设置 tableheaderview 的用法 用这个类的实例

            loanApplicationStepsView.bounds.size.height = loanApplicationStepsView.intrinsicContentheight
            

            正如 Kalle 所说,仅仅因为没有 func tableViewHeightForHeader(_ tableView: UITableView) -> uitableviewdelegate 中的 CGFloat 并不意味着你不必为了计算它而跳舞

            宽度由uikit自动设置

            【讨论】:

              【解决方案9】:

              尝试在您的标题中设置 UITableViewDelegate 并将以下代码放入您的 .m 文件中。

              #pragma mark UITableViewDelegate
              - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 
                  return 44.0f;
              }
              
              - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
                  StandardTableHeaderView *headerView = [[StandardTableHeaderView alloc] initWithFrame:CGRectMake(0,0,320,44)];
              
                  return headerView;
              }
              

              【讨论】:

                猜你喜欢
                • 2015-11-27
                • 2021-12-25
                • 2016-12-09
                • 2019-12-05
                • 2015-07-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多