Окончательный UIButton в UITableViewCell является неизменяемым

У меня есть UITableView (и связанные ячейки) с переменным количеством элементов. Внутри каждой ячейки находятся значения, связанные с отображаемым объектом. Существует также кнопка, позволяющая пользователю указать, завершена ли отображаемая задача (из свойств объекта) или нет. Предполагается, что он меняет цвет и становится активным. Это работает, за исключением конечного пункта в списке. Вот код, который не работает:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TasksItem"];
    [BAPAppDelegate setBorder:[cell viewWithTag:300] withBorder:[BAPAppDelegate darkGreyColor]];
    [BAPAppDelegate setBorder:[cell viewWithTag:301] withBorder:[UIColor blackColor]];
    [BAPAppDelegate setBorder:[cell viewWithTag:1000] withBorder:[UIColor blackColor]];
    ServiceRequest *sr = (mListTasks)[indexPath.row];
    [(UILabel *)[cell viewWithTag:110] setText:sr.vSRType];
    UILabel *smry = (UILabel *)[cell viewWithTag:301];
    smry.text = [NSString stringWithFormat:@"%@", [sr vMTSmry]];    // check if completed
    int cnt;
    int complete;
    UIButton* btn;
    cnt = [sr getBeforeRequired];
    complete = [sr getBeforeCompleted];
    markCompleteButton = YES;
    btn = (UIButton *)[cell viewWithTag:120];
    if (cnt > 0) {
        [btn setHidden:NO];
        [btn setTitle:[NSString stringWithFormat:@"%i", cnt] forState:UIControlStateNormal];
    } else {
        [btn setTitle:@"0" forState:UIControlStateNormal];
        [btn setTitleColor:[BAPAppDelegate greenColor] forState:UIControlStateNormal];
    }
    if (complete < cnt) {
        [btn setTitleColor:[BAPAppDelegate redColor] forState:UIControlStateNormal];
        [self markComplete:NO];
    } else {
        [btn setTitleColor:[BAPAppDelegate greenColor] forState:UIControlStateNormal];
    }
    cnt = [sr getDuringRequired];
    complete = [sr getDuringCompleted];
    btn = (UIButton *)[cell viewWithTag:121];
    if (cnt > 0) {
        [btn setHidden:NO];
        [btn setTitle:[NSString stringWithFormat:@"%i", cnt] forState:UIControlStateNormal];
    } else {
        [btn setTitle:@"0" forState:UIControlStateNormal];
        [btn setTitleColor:[BAPAppDelegate greenColor] forState:UIControlStateNormal];
    }
    if (complete < cnt) {
        [btn setTitleColor:[BAPAppDelegate redColor] forState:UIControlStateNormal];
        [self markComplete:NO];
    } else {
        [btn setTitleColor:[BAPAppDelegate greenColor] forState:UIControlStateNormal];
    }
    cnt = [sr getAfterRequired];
    complete = [sr getAfterCompleted];
    btn = (UIButton *)[cell viewWithTag:122];
    if (cnt > 0) {
        [btn setHidden:NO];
        [btn setTitle:[NSString stringWithFormat:@"%i", cnt] forState:UIControlStateNormal];
    } else {
        [btn setTitle:@"0" forState:UIControlStateNormal];
        [btn setTitleColor:[BAPAppDelegate greenColor] forState:UIControlStateNormal];
    }
    if (complete < cnt) {
        [btn setTitleColor:[BAPAppDelegate redColor] forState:UIControlStateNormal];
        [self markComplete:NO];
    } else {
        [btn setTitleColor:[BAPAppDelegate greenColor] forState:UIControlStateNormal];
    }
    cnt = [sr getCheckRequired];
    complete = [sr getCheckCompleted];
    btn = (UIButton *)[cell viewWithTag:123];
    if (complete < cnt) {
        [btn setTitleColor:[BAPAppDelegate redColor] forState:UIControlStateNormal];
        [btn setImage:[UIImage imageNamed:@"check_red.png"] forState:UIControlStateNormal];
        [self markComplete:NO];
    } else {
        [btn setTitleColor:[BAPAppDelegate greenColor] forState:UIControlStateNormal];
        [btn setImage:[UIImage imageNamed:@"check.png"] forState:UIControlStateNormal];
    }
    btn = (UIButton *)[cell viewWithTag:1000];
    [btn setTag:indexPath.row + 1001];
    if (markCompleteButton) {
        [btn setBackgroundColor:[BAPAppDelegate greenColor]];
        [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [btn setEnabled:YES];
        [btn setTitle:@"YEP" forState:UIControlStateNormal];
        NSLog(@"YEP %ld", (long)indexPath.row);
    } else {
        [btn setEnabled:NO];
        NSLog(@"NOPE %ld", (long)indexPath.row);
    }
    [cell prepareForReuse];
    return cell;
}

Как и ожидалось, журнал отображает «YEP 8», но ничего о самой кнопке не меняется. Другие кнопки, расположенные ранее в списке, отображаются и выполняют свои действия должным образом.

Любая проницательность была бы очень оценена!

1 ответ

  1. В итоге я разделил UITableViewCell на подклассы и подключил UITableViewCell из раскадровки к подклассу, а затем подключил розетку кнопки к подклассу. Кроме того, я установил Действие кнопки, чтобы перейти к подклассу.

    TasksCell.ч

    @protocol TasksCellDelegate <NSObject>
    - (void)buttonPressed:(UIButton *)sender;
    @end
    
    @interface TasksCell : UITableViewCell
    @property (weak, nonatomic) id<TasksCellDelegate> delegate;
    @property (weak, nonatomic) IBOutlet UIButton *button;
    
    - (IBAction)buttonPressed:(UIButton *)sender;
    @end
    

    TasksCell.м:

    #import "TasksCell.h"
    
    @implementation TasksCell
    - (id)initWithFrame:(CGRect)frame {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
        }
        return self;
    }
    
    - (IBAction)buttonPressed:(UIButton *)sender {
        [self.delegate buttonPressed:sender];
    }
    @end
    

    TasksViewController.ч

    #import "TasksCell.h"
    

    TasksViewController.м:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        TasksCell *cell;
        cell = [tableView dequeueReusableCellWithIdentifier:@"TasksItem"
                                               forIndexPath:indexPath];
        [BAPAppDelegate setBorder:[cell viewWithTag:300] withBorder:[BAPAppDelegate darkGreyColor]];
        [BAPAppDelegate setBorder:[cell viewWithTag:301] withBorder:[UIColor blackColor]];
        [BAPAppDelegate setBorder:[cell viewWithTag:1000] withBorder:[UIColor blackColor]];
        ServiceRequest *sr = (mListTasks)[indexPath.row];
        [(UILabel *)[cell viewWithTag:110] setText:sr.vSRType];
        UILabel *smry = (UILabel *)[cell viewWithTag:301];
        smry.text = [NSString stringWithFormat:@"%@", [sr vMTSmry]];    // check if completed
        int cnt;
        int complete;
        UIButton* btn;
        cnt = [sr getBeforeRequired];
        complete = [sr getBeforeCompleted];
        markCompleteButton = YES;
        btn = (UIButton *)[cell viewWithTag:120];
        if (cnt > 0) {
            [btn setHidden:NO];
            [btn setTitle:[NSString stringWithFormat:@"%i", cnt] forState:UIControlStateNormal];
        } else {
            [btn setTitle:@"0" forState:UIControlStateNormal];
            [btn setTitleColor:[BAPAppDelegate greenColor] forState:UIControlStateNormal];
        }
        if (complete < cnt) {
            [btn setTitleColor:[BAPAppDelegate redColor] forState:UIControlStateNormal];
            [self markComplete:NO];
        } else {
            [btn setTitleColor:[BAPAppDelegate greenColor] forState:UIControlStateNormal];
        }
        cnt = [sr getDuringRequired];
        complete = [sr getDuringCompleted];
        btn = (UIButton *)[cell viewWithTag:121];
        if (cnt > 0) {
            [btn setHidden:NO];
            [btn setTitle:[NSString stringWithFormat:@"%i", cnt] forState:UIControlStateNormal];
        } else {
            [btn setTitle:@"0" forState:UIControlStateNormal];
            [btn setTitleColor:[BAPAppDelegate greenColor] forState:UIControlStateNormal];
        }
        if (complete < cnt) {
            [btn setTitleColor:[BAPAppDelegate redColor] forState:UIControlStateNormal];
            [self markComplete:NO];
        } else {
            [btn setTitleColor:[BAPAppDelegate greenColor] forState:UIControlStateNormal];
        }
        cnt = [sr getAfterRequired];
        complete = [sr getAfterCompleted];
        btn = (UIButton *)[cell viewWithTag:122];
        if (cnt > 0) {
            [btn setHidden:NO];
            [btn setTitle:[NSString stringWithFormat:@"%i", cnt] forState:UIControlStateNormal];
        } else {
            [btn setTitle:@"0" forState:UIControlStateNormal];
            [btn setTitleColor:[BAPAppDelegate greenColor] forState:UIControlStateNormal];
        }
        if (complete < cnt) {
            [btn setTitleColor:[BAPAppDelegate redColor] forState:UIControlStateNormal];
            [self markComplete:NO];
        } else {
            [btn setTitleColor:[BAPAppDelegate greenColor] forState:UIControlStateNormal];
        }
        cnt = [sr getCheckRequired];
        complete = [sr getCheckCompleted];
        btn = (UIButton *)[cell viewWithTag:123];
        if (complete < cnt) {
            [btn setTitleColor:[BAPAppDelegate redColor] forState:UIControlStateNormal];
            [btn setImage:[UIImage imageNamed:@"aprsi_check_red.png"] forState:UIControlStateNormal];
            [self markComplete:NO];
        } else {
            [btn setTitleColor:[BAPAppDelegate greenColor] forState:UIControlStateNormal];
            [btn setImage:[UIImage imageNamed:@"aprsi_check.png"] forState:UIControlStateNormal];
        }
        [cell.button setTag:indexPath.row + 1001];
        if (markCompleteButton) {
            cell.button.backgroundColor = [BAPAppDelegate greenColor];
            [cell.button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
            [cell.button setEnabled:YES];
            NSLog(@"YEP %ld", (long)indexPath.row);
        } else {
            [cell.button setTitleColor:[BAPAppDelegate darkGreyColor] forState:UIControlStateDisabled];
            [cell.button setBackgroundColor:[BAPAppDelegate lightGreyColor]];
            [cell.button setEnabled:NO];
            NSLog(@"NOPE %ld", (long)indexPath.row);
        }
        [cell prepareForReuse];
        return cell;
    }
    

    Что позволило кнопке работать так, как ожидалось, я сохранил делегат кнопки в TasksViewController, но так же легко мог переместить его в подкласс. Надеюсь, это поможет кому-то!