Пользовательский UIButton в UITableViewCell - Удалить не работает - PullRequest
0 голосов
/ 29 марта 2011

Я получил пользовательскую кнопку UIB в своей TableViewCell через:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *ident = @"indet";

    cell = [tableView dequeueReusableCellWithIdentifier:ident];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:ident] autorelease];

    }

    button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setFrame: CGRectMake( 230.0f, 7.5f, 43.0f, 43.0f)];
    [button setImage:[UIImage imageNamed:@"check_bak.png"] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(removeEntry) forControlEvents:UIControlEventTouchUpInside];
    button.tag = [indexPath row];
    [cell addSubview:button];
    cell.textLabel.text =  [myArray objectAtIndex:indexPath.row];
    cell.textLabel.textColor = [UIColor blackColor];
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:20.0];
    cell.textLabel.shadowColor = [UIColor whiteColor];
    cell.textLabel.shadowOffset = CGSizeMake(0,1);

    return cell;
}

Я объявил indexPath в своем .h для функции removeEntry.

RemoveEntry:

[myArray removeObjectAtIndex:indexPath.row];
[myTable reloadData];

myArray является NSMutableArray.

Этот способ не работает должным образом.

Каждый раз, когда я удаляю запись в indexPath.row, она действительно удаляет запись. Но неправильно. Это всегда одна запись выше, которая удаляется. Даже если я сделаю indexPath.row + 1 / -1.

Есть ли другой способ? Кнопка должна оставаться в клетке.

Надеюсь, это понятно, извините, я немец. :)

Ответы [ 3 ]

0 голосов
/ 30 марта 2011

Используйте следующий код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

     static NSString *ident = @"indet";

     cell = [tableView dequeueReusableCellWithIdentifier:ident];
     if (cell == nil) {
          cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:ident] autorelease];

     }
     if ([cell.contentView subviews]){
        for (UIView *subview in [cell.contentView subviews]) {
                [subview removeFromSuperview];
          }
     }
     //below here your piece of code.
}

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

Надеюсь, это сработает для вас!

0 голосов
/ 25 июня 2014

Я столкнулся с той же проблемой в моем кодировании iOS с UITableView. Я исправил это, добавив кнопку на cell.contentView и удалив ее из cell.contentView.

Кнопка добавления с

[cell.contentView addSubview:button];

вместо [ячейка addSubview: кнопка];

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

for(UIView *subview in [cell.contentView subviews]){
     [subview removeFromSuperView];
}

Это будет работать правильно.

0 голосов
/ 29 марта 2011

Сколько разделов в вашем табличном представлении?Хорошей идеей будет вывести на консоль значение indexPath.row в вашем методе removeEntry.Если вы нажмете на первую строку, будет ли напечатан 0?Пятая строка, распечатывается 4 и т. Д.

РЕДАКТИРОВАТЬ: глядя на ваш код, вы сохраняете indexpath в качестве тега кнопки.В этом случае измените метод removeEntry так, чтобы он выглядел следующим образом (вы можете изменить тип возвращаемого значения на любой, который вы хотите вернуть):

- (void)removeEntry:(id)sender {

И добавить двоеточие после «removeEntry» при добавленииtarget:

[button addTarget:self action:@selector(removeEntry:) forControlEvents:UIControlEventTouchUpInside];

Теперь внутри removeEntry вы можете сделать:

UIButton *button = (UIButton *)sender;
[myArray removeObjectAtIndex:button.tag];
[myTable reloadData];
...