У вас есть два вида проблем: первая возникла у AliSoftware в его предыдущем ответе: вы должны установить мгновенное свойство на NO, чтобы избежать проблемы с мерцанием.
Но основная проблема заключается вкак вы используете метод делегата
tableView:viewForHeaderInSection:
.В этом методе вы каждый раз воссоздаете один и тот же вид с двумя плохими эффектами: - первый виден в вашем приложении: сегментированный элемент управления повторно инициализируется, а выбранная кнопка устанавливается на первый (индекс 0) - втораядобавляет утечку памяти каждый раз, когда метод вызывается табличным представлением.Учтите, что этот метод вызывается несколько раз представлением таблицы и выходит из-под вашего контроля: по сути, каждый раз, когда заголовок прокручивается за пределы экрана, а затем снова вводится, таблице необходимо заново создать представление и снова вызывать метод.В вашем коде сегмент создается, но никогда не освобождается, поэтому происходит утечка.
Решение этой проблемы состоит в том, чтобы определить один экземпляр для заголовка, установить его изначально равным nil, а затем проверить, является ли он нулевым или нет.Если ноль, создайте его, если не используете ранее сгенерированный экземпляр.Другой возможный способ сделать это в коде ниже.Поэтому создайте статический экземпляр и используйте dispatch_once в GCD для создания сегментированного элемента управления только в первый раз.В этом случае вы никогда не потеряете текущий статус управления, так как он будет повторно использоваться при каждом вызове заголовка.Вы можете повысить производительность, переместив создание всего заголовка UIView в блок dispatch_once, избегая при этом лишних выделений каждый раз.
static UISegmentedControl *sortControl;
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIColor *tintColor = [UIColor colorWithRed:241.0/255 green:78.0/255 blue:35.0/255 alpha:1];
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sortControl = [[UISegmentedControl alloc] initWithItems:
[NSArray arrayWithObjects:@"Distance", @"Rating", @"Name", nil]];
sortControl.segmentedControlStyle = UISegmentedControlStyleBar;
sortControl.tintColor = tintColor;
sortControl.frame = CGRectMake(20, 20, 280, 35);
sortControl.selectedSegmentIndex = 0;
});
[sortControl addTarget:self action:@selector(sortChanged) forControlEvents:UIControlEventValueChanged];
UIView *view=[UIView new];
view.frame = CGRectMake(0, 0, 320, 70);
view.backgroundColor =[UIColor blueColor];
sortControl.momentary = NO;
[sortControl setEnabled:YES forSegmentAtIndex:0];
[sortControl setEnabled:YES forSegmentAtIndex:1];
[sortControl setEnabled:YES forSegmentAtIndex:2];
view.userInteractionEnabled = YES;
[view addSubview:sortControl];
return view;
}