Я работаю над проектом, и я пытаюсь настроить заголовок таблицы на комплексный вид. Этот проект не использует автоматическую компоновку, и все ограничения обрабатываются программно. У меня есть контроллер 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.
Переопределение метода, вы должны сначала назвать супер. Итак, переместите '[super updateViewConstraints]' на верхний в 'updateViewConstraints' метод. –
Я бы предположил и сказал, что 'updateViewConstraints' не вызывается, когда вы думаете, что это так; в частности, ограничения вашего представления для заголовка вызываются после создания таблицы. Так как «tableHeaderView» обычно равен нулю, таблица не обновляется, чтобы отразить его добавление. Бросьте некоторые точки останова в вашем коде в методах, которые вы перечисляете, и убедитесь, что поток приложения соответствует вашему намерению. –