Изменить фон представления UIButton при нажатии

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

Когда пользователь нажимает кнопку, метод целевого действия (showDeleteSheet) затем вызывает UIActionSheet с переменной, чтобы указать indexPath нажатой строки. Затем пользователь нажимает кнопку «Удалить» в листе действий, и метод clickedButtonAtIndex листа действий удаляет файл.

Теперь мне нужно обновить свойство фонового изображения кнопки, чтобы изменить изображение в соответствующей ячейке таблицы на незагруженное изображение. Это можно сделать либо в методе целевого действия кнопки, либо в методе clickedButtonAtIndex листа действий.

Вот код:

В методе таблицы cellForRowAtIndexPath я создаю кнопку:

UIButton *deleteButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain]; 
    [deleteButton addTarget:self action:@selector(showDeleteSheet:) forControlEvents:UIControlEventTouchDown];
    deleteButton.frame = CGRectMake(246, 26, 30, 30);
    if (![AppData isDownloaded:[dets objectForKey:@"fileName"]]) {
        [deleteButton setBackgroundImage:notdownloadedImage forState:UIControlStateNormal];
    } else {
        [deleteButton setBackgroundImage:notdownloadedImage forState:UIControlStateNormal];
    }

В целевом методе кнопки:

-(void)showDeleteSheet:(id)sender {
    //get the cell row that the button is in
    NSIndexPath *indexPath = [table indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
    NSInteger currentSection = indexPath.section;
    NSInteger currentIndexRow = indexPath.row;

    NSLog(@"section = %i row = %i", currentSection, currentIndexRow);

    UIButton *deleteButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [table reloadData];

    //if deleteButton is declared in .h then the other instances of deleteButton show 'local declaration hides instance variable'
    [deleteButton setBackgroundImage:[UIImage imageNamed:@"not-downloaded.png"] forState:UIControlStateNormal];


    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Delete this file?" 
                                             delegate:self 
                                    cancelButtonTitle:@"Cancel" 
                               destructiveButtonTitle:@"Delete" 
                                    otherButtonTitles:nil];                         
    actionSheet.tag = currentIndexRow;
    actionSheet.actionSheetStyle = UIActionSheetStyleDefault;
    [actionSheet showInView:self.view];
    [actionSheet release];

}

Возможно, проблема в том, что вызов [deleteButton setBackgroundImage...]; не знает, какая кнопка ячейки должна быть обновлена. Если да, то я не знаю, как сказать, какой.

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

Я пытался принудительно перезагрузить таблицу, но [table reloadData]; ничего не делает. Я пробовал reloadRowsAtIndexPaths и все равно ничего не получалось.

Кто-нибудь хочет обучить меня тому, как это делается?


person Michael Morrison    schedule 22.04.2010    source источник


Ответы (1)


Вы можете просто сохранить (id) отправителя из

-(void)showDeleteSheet:(id)sender

метод в переменной экземпляра.

self.curButton = sender;

тогда позвони

[curButton setBackgroundImage:image];
person Joe Cannatti    schedule 22.04.2010
comment
Спасибо, Джо... это помогает: [sender setBackgroundImage:[UIImage imageNamed:@not-downloaded-arrow.png] forState:UIControlStateNormal]; Теперь... (всегда есть сейчас)... если пользователь нажимает кнопку "Отмена", изображение все еще изменяется, потому что изменение изображения происходит в методе showDeleteSheet, а не в методе clickedButtonAtIndex листа действий. Конечно, я не могу получить отправителя. Есть предположения? - person Michael Morrison; 22.04.2010
comment
Странно, я могу установить фоновое изображение, но не могу установить для userInteractionEnabled значение no, чтобы отключить кнопку с помощью [sender userInteractionEnabled = NO]; - person Michael Morrison; 22.04.2010
comment
вы имеете в виду sender.userInteractionEnabled = NO; или [отправитель setUserInteractionEnabled:NO]; правильно ? - person Joe Cannatti; 22.04.2010
comment
чтобы решить проблему отмены, вы можете установить self.curButton = nil; при нажатии кнопки отмены - person Joe Cannatti; 22.04.2010
comment
Теперь я понимаю, что вы имеете в виду, говоря о сохранении отправителя в переменной экземпляра. Однако я не знаю, что делать с переменной... не могу сделать ее целой, и идентификатор не помогает. Отправитель кнопки выглядит как массив. - person Michael Morrison; 24.04.2010
comment
Итак, чтобы завершить этот вопрос. Я создал NSArray *buttonSender в файле .h. Затем в цели кнопки сделал buttonSender = sender; помещая кнопку в массив. Затем в листе действий я отправил методу swapImage массив с [self swapImage:buttonSender]; Спасибо Джо за указатель. - person Michael Morrison; 24.04.2010