iPhone / Objective-C - проблема с сбросом UIButton в UITableViewCell - PullRequest
0 голосов
/ 29 июня 2011

У меня есть UIButton внутри пользовательского UITableViewCell.Я добавил эту кнопку в Интерфейсном Разработчике.

Затем я использую следующий код в cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"GenericCellButton";

    GenericCellButton *cell = (GenericCellButton *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:nil options:nil];

        for (id currentObject in topLevelObjects) {
            if ([currentObject isKindOfClass:[UITableViewCell class]]) {
                cell = (GenericCellButton *)currentObject;
                break;
            }
        }
    }

    [cell.inviteButton addTarget:self action:@selector(inviteButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
    [cell.inviteButton setTag:indexPath.row];

    // This statement doesn't get called...?
    if ([cell.inviteButton.titleLabel.text isEqualToString:@"Please Wait"]) {
        [cell.inviteButton setEnabled:NO];
        [cell.inviteButton setTitle:@"Please Wait" forState:UIControlStateDisabled];
    }
  ...

Это метод followTapped::

- (void)followTapped:(id)sender {
    UIButton *button = (UIButton *)sender;
    [button setEnabled:NO];
    [button setTitle:@"Please Wait" forState:UIControlStateDisabled];

    // I then call a service method that then fires off a callback method that refreshes the `tableView`. This changes the button text to "Following".
}

Все работает просто отлично с точки зрения сохранения записи.

Проблема в том, что до вызова метода обратного вызова;если пользователь прокручивает видимую ячейку вне поля зрения до обновления tableView, он сбрасывает кнопку обратно на «Follow» вместо «Please Wait», что означает, что, если они снова нажмут кнопку «Follow», это вызовет проблемы в моембаза данных.

Как я могу остановить обновление этой конкретной ячейки до перезагрузки tableView, если она прокручивается вне поля зрения?Я попытался добавить некоторую логику в cellForRowAtIndexPath:, которая проверяет, является ли текст кнопки «Пожалуйста, подождите», но, похоже, он не работает должным образом.Он по-прежнему сбрасывается обратно на «Follow».

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

Класс UITableView обычно настроен на переработку ячеек.Если вы настроите его таким образом, например, следуя шаблону, предоставленному Apple, то использование ячейки для сохранения какой-либо информации о состоянии не будет работать.Обычный подход - восстановить любое необходимое вам состояние в методе cellForRowAtIndexPath: и применить его к ячейке.Поэтому получите ваш followTapped: метод для сохранения состояния, а затем в cellForRowAtIndexPath: примените [button setEnabled:NO]; и [buttonSetTitle:@"Please wait"]; в соответствии с сохраненным состоянием.Надеюсь, что это помогает (и что я не упустил суть вопроса.)

1 голос
/ 29 июня 2011
- (void)followTapped:(id)sender 
{
UIButton *button = (UIButton *)sender;
[button setEnabled:NO];
[button setTitle:@"Please Wait" forState:UIControlStateDisabled];

selectedIndex = indexPath.row; //create this variable in .h file 

// I then call a service method that then fires off a callback method that refreshes the `tableView`. This changes the button text to "Following".
 }

Сейчас

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"GenericCellButton";

GenericCellButton *cell = (GenericCellButton *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:nil options:nil];

    for (id currentObject in topLevelObjects) {
        if ([currentObject isKindOfClass:[UITableViewCell class]]) {
            cell = (GenericCellButton *)currentObject;
            break;
        }
    }
}

[cell.inviteButton addTarget:self action:@selector(inviteButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
[cell.inviteButton setTag:indexPath.row];

// This statement doesn't get called...?
if (selectedIndex == indexPath.row)
{
    [cell.inviteButton setEnabled:NO];
    [cell.inviteButton setTitle:@"Please Wait" forState:UIControlStateDisabled];
}

...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...