设置自定义UITableView tableHeaderView

时间:2015-01-04 03:36:18

标签: ios objective-c uitableview autolayout

我正在处理一个项目,我正在尝试将表视图标题设置为复杂的View。此项目不使用自动布局,所有约束都以编程方式处理。我有一个包含表视图的父视图控制器。

以下是父视图控制器的代码(委托和数据源在父级中)

@property (nonatomic, strong) NSMutableArray *array;

- (void)viewDidLoad
{
  [super viewDidLoad];

  self.array = [NSMutableArray new];

  [self.array addObject:@"One"];
  [self.array addObject:@"Two"];
  [self.array addObject:@"Three"];
  [self.array addObject:@"Four"];

  [self.view addSubview:self.detailedTableView];
}

- (void)updateViewConstraints
{

  [super updateViewConstraints];

  NSDictionary *views = @{
                          @"detailedTable": self.detailedTableView,
                          };



  [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[detailedTable]-0-|" options:0 metrics:nil views:views]];
  [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[detailedTable]-0-|" options:0 metrics:nil views:views]];

                                                   constant:0.f]];


}

-(UITableView *)detailedTableView
{
  if(!_detailedTableView)
  {
    _detailedTableView = [UITableView new];
    _detailedTableView.dataSource = self;
    _detailedTableView.delegate   = self;
    _detailedTableView.separatorStyle                 = UITableViewCellSeparatorStyleNone;
    _detailedTableView.showsVerticalScrollIndicator   = NO;
    _detailedTableView.separatorInset                 = UIEdgeInsetsZero;
    _detailedTableView.translatesAutoresizingMaskIntoConstraints = NO;
  }

  return _detailedTableView;
}

在从父级继承的子视图控制器中,我正在尝试将标题视图设置为子视图控制器中包含的自定义视图。以下是相关代码:

@interface ChildViewController ()

@property (nonatomic, strong) UIView        *testView;
@end

@implementation ChildViewController

- (void)viewDidLoad
{

  [super viewDidLoad];

  self.detailedTableView.tableHeaderView = self.testView;
}

-(UIView *)testView
{
  if(!_testView)
  {
    _testView = [UIView new];
    _testView.backgroundColor = [UIColor orangeColor];
    _testView.translatesAutoresizingMaskIntoConstraints = NO;
  }

  return _testView;
}

- (void)updateViewConstraints
{

  [super updateViewConstraints];

  NSDictionary *views = @{
      @"test"         : self.testView
  };

  [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[test(width)]-0-|" options:0 metrics:metrics views:views]];
  [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[test(100)]" options:0 metrics:metrics views:views]];


}

我没有通过frame属性设置宽度或高度,而是通过约束。但是,此代码在iOS 8.1上生成下面的图像,并在iOS 7.1上完全崩溃

我可以看到正在添加虚拟视图,但它不适合作为tableHeaderView,因为它覆盖了UITable中的其他数组项。此外,这不适用于iOS 7.1,因为它会抛出此错误消息:

  *** Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8794
    2015-01-03 22:33:05.540 Saloote A[10073:607] This is where we save the application data during a exception
    2015-01-03 22:33:05.541 Saloote A[10073:607] Exception: Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super.

enter image description here

1 个答案:

答案 0 :(得分:1)

这是因为您的测试视图不是vc.view的子视图。

您只能为子视图添加约束。

您可以使用setFrame而不是autoLayout。