2015-01-04 4 views
0

Я работаю над проектом, и я пытаюсь настроить заголовок таблицы на комплексный вид. Этот проект не использует автоматическую компоновку, и все ограничения обрабатываются программно. У меня есть контроллер Parent View, который содержит представление таблицы.Настройка пользовательского UITableView tableHeaderView

Вот код для контроллера родительского вида (делегат и источник данных в родителю)

@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]]; 


} 

Я не устанавливать ширину или высоту через свойство кадра, а через ограничения. Тем не менее, этот код создает изображение ниже на iOS 8.1 и полностью падает на iOS 7.1

Я вижу, что добавляется фиктивный вид, но это не подходящее место для таблицыHeaderView, поскольку оно скрывает другое элементов массива в UITable. Плюс это не работает на прошивке 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

+0

Переопределение метода, вы должны сначала назвать супер. Итак, переместите '[super updateViewConstraints]' на верхний в 'updateViewConstraints' метод. –

+0

Я бы предположил и сказал, что 'updateViewConstraints' не вызывается, когда вы думаете, что это так; в частности, ограничения вашего представления для заголовка вызываются после создания таблицы. Так как «tableHeaderView» обычно равен нулю, таблица не обновляется, чтобы отразить его добавление. Бросьте некоторые точки останова в вашем коде в методах, которые вы перечисляете, и убедитесь, что поток приложения соответствует вашему намерению. –

ответ

1

Это происходит потому, что вид вашего теста не является подтаблицей из vc.view непосредственно.

Вы можете добавлять ограничения только для своего дочернего представления.

Вы можете использовать setFrame вместо autoLayout.

+0

. Каким должен быть поток, если это будет что-то вроде: [self.view addSubview: self.testView]; self.detailedTableView.tableHeaderView = self.testView; Потому что я пробовал этот подход, но все же сталкивался с той же проблемой. – zic10

+0

Я могу получить высоту представления для пользовательского представления и использовать ее для свойства height в кадре CGRect для headerView. Спасибо за этот ответ, это сработало. – zic10

Смежные вопросы