UISegmentControl ведет себя необычно, когда помещается в заголовок tableView - PullRequest
1 голос
/ 19 сентября 2011

У меня возникла проблема с реализацией управления сегментами. Поскольку я хочу, чтобы это был фиксированный заголовок, поэтому, когда я прокручиваю, я всегда могу видеть его, я внедрил его в

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

Пока все хорошо, появляется контроль сегмента. Проблема в том, когда сегменты нажимаются. Хотя функция, реализованная с помощью селектора, вызывается, и элемент управления сегмента имеет правильный selectedSegmentIndex, сегменты не подсвечиваются, за исключением того, который изначально установлен с

sortControl.selectedSegmentIndex = 0; в viewForHeaderInSection. Этот сегмент взаимодействует, будучи выделенным и не выделенным (при повторном нажатии). Еще одна странная вещь - когда я нажимаю на другие сегменты, сегмент в 0 становится подсвеченным.

Вот полный код для viewForHeaderInSection:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

     UIColor *tintColor = [UIColor colorWithRed:241.0/255 green:78.0/255 blue:35.0/255 alpha:1];



    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 setEnabled:YES forSegmentAtIndex:0];
        [sortControl setEnabled:YES forSegmentAtIndex:1];
        [sortControl setEnabled:YES forSegmentAtIndex:2];


        view.userInteractionEnabled = YES;

        [view addSubview:sortControl];




        return view;

    }

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

У вас есть два вида проблем: первая возникла у 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;

}
2 голосов
/ 19 сентября 2011

Это потому, что вы установили sortControl.momentary = YES;.

. Это свойство делает каждый сегмент вашего SegmentedControl похожим на «мгновенную кнопку», то есть при касании сегмента сегмент подсвечивается, затем он вызываетсобытие, и когда вы перестаете касаться, оно возвращается в исходное состояние.

Удаление этой строки (или установка этого свойства в NO) должно решить вашу проблему.

...