Конфигурация UITableViewCell - PullRequest
       6

Конфигурация UITableViewCell

1 голос
/ 23 февраля 2012

В моем приложении есть UITableView, в котором хранится список URL-адресов.Над таблицей находятся UITextField и UIButton.Когда пользователь вводит какой-то URL в textField, а затем нажимает кнопку, я добавляю этот URL, как верхний элемент в tableView.Затем, когда пользователь выбирает любой из URL-адресов, я хочу создать кнопку в выбранном UITableViewCell, чтобы позволить пользователю следовать этому URL-адресу (на самом деле, это не важно).Вот определение метода didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self.recentUrlsTableView cellForRowAtIndexPath:indexPath];

    UIButton *button = [UIButton new];
    button.frame = CGRectMake(cell.frame.size.width - 34, cell.frame.origin.y + 10, 24, 24);
    button.backgroundColor = [UIColor lightGrayColor];
    [button setTitle:@">" forState:UIControlStateNormal];
    [cell.contentView addSubview:button];
    [button release];
}

Но я хочу, чтобы эти кнопки исчезали при отмене выбора ячейки.Итак, я попробовал эту вещь (я думаю, это выглядит глупо, но, к сожалению, я не знал лучшего способа найти там свою кнопку):

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self.recentUrlsTableView cellForRowAtIndexPath:indexPath];
    for (UIView *subview in cell.subviews)
    {
        if ([subview isKindOfClass:[UIButton class]])
            if ([[(UIButton*)subview titleLabel].text isEqualToString:@">"])
            {
                [subview removeFromSuperview];
                [subview release];
            }
    }
}

Но эта штука, похоже, работала неправильно - вместо того, чтобы выпускатьи, вообще исчезнув, кнопка начала появляться в других строках - даже в тех, которые были пустыми.

После этого я пытался выполнять одинаковые действия для каждой строки в методе - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath.Но это также не помогло.

Полагаю, есть какая-то тривиальная проблема, но я не могу ее найти.Поэтому я буду очень признателен за любую вашу помощь!

1 Ответ

1 голос
/ 23 февраля 2012

При прокрутке вверх / вниз ячейки таблицы используются повторно, и ячейка (с кнопкой) может быть заполнена совершенно разным содержимым (т.е. используется для другого indexpath).Вот почему вы испытываете это.

Так что на вашем столе всегда есть только одна кнопка (или ее нет).

Лучше всего, если вы создадите (повторно сохраните ссылкуэто) одна кнопка снаружи стола.Ваш didDeselectRowAtIndexPath будет выглядеть следующим образом:

  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
        UITableViewCell *cell = [self.recentUrlsTableView cellForRowAtIndexPath:indexPath];

        //you have outside reference for this button
        [button removeFromSuperView];
        button.frame = CGRectMake(cell.frame.size.width - 34, cell.frame.origin.y + 10, 24, 24);
        [cell.contentView addSubview:button];
}

Если это не сработает, вы должны использовать комбинацию reloadData и cellForIndexPath.Вот так:

   - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
        {
            [self.recentUrlsTableView reloadData];    
        }

    - (void)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
       {
            //create your cell as usually

            if ([cell isSelected]) {  //i'm not sure if this is the right way to detect selected cell

               [button removeFromSuperView];
               button.frame = CGRectMake(cell.frame.size.width - 34, cell.frame.origin.y + 10, 24, 24);
               [cell.contentView addSubview:button];

             } 
       }
...