tableHeaderView - layoutSubviews和initWithFrame

时间:2016-02-29 17:15:49

标签: ios objective-c uitableview

我有一个自定义的UITableViewHeaderFooterView类和一个xib。此xib中有一个标签,它使用插座连接到自定义类。此自定义类用作视图控制器中表视图的tableHeaderView。

我能够显示带有所需尺寸的标题视图,但标题中的标签未显示任何值。

在视图控制器的viewDidLoad。

Meteor.publish('all_users', function () {
  return Meteor.users.find({
    _id: { $ne: this.userId }
  });
});

在DashboardHeaderView中,它是UITableViewHeaderFooterView的子类。

- (void)viewDidLoad {
  ..
  DashboardHeaderView* headerView = [[DashboardHeaderView alloc] initWithFrame:CGRectMake(0, 0, 320, 180) headerText:@"XYX"];
  self.alertsTableView.tableHeaderView = headerView; 
}

如果我在initWithFrame中添加一些日志消息:headerText:和layoutSubviews,我可以看到两者的self指向不同的地址,因此在layoutSubviews中,self.headerText总是为零。

- (id)initWithFrame:(CGRect)frame headerText:(NSString *)headerText {
   if (self = [super initWithFrame:frame]) {
      self.headerText = headerText;

      NSArray* objects = [[NSBundle mainBundle] loadNibNamed:@"DashboardHeaderView"
                                                     owner:self
                                                   options:nil];
      UIView *nibView = [objects firstObject];
      UIView *contentView = self.contentView;
      contentView.backgroundColor = [UIColor clearColor];
      CGSize contentViewSize = contentView.frame.size;
      nibView.frame = CGRectMake(0, 0, contentViewSize.width, contentViewSize.height);

      [contentView addSubview:nibView];        
  }    
  return self;   
}        

- (void)layoutSubviews {
    [super layoutSubviews];
    self.headerLabel.text = self.headerText;
}

如果查看上面的日志,为什么我们有两个不同的地址 - 0x7ff862cf1a90和0x7ff862cf05e0。

1 个答案:

答案 0 :(得分:0)

UIView Class Reference说:

  

layoutSubviews - 如果您需要更精确,请实施此方法   控制子视图的布局比约束或   自动化行为提供。

您正在layoutSubviews方法中设置UILabel的值,该值仅用于调整操作大小。

我建议您将self.headerLabel.text = self.headerText指令移到initWithFrame:headerText:方法中,然后执行其他操作,例如将约束调整大小或更改为layoutSubviews方法。

通过这种方式它工作正常! enter image description here