2010-04-22 2 views
0

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

Когда пользователь нажимает кнопку, метод целевого действия (showDeleteSheet) затем вызывает таблицу UIActionSheet с переменной, чтобы дать ему индексную строку строки. Затем пользователь нажимает кнопку delete на листе действий, и метод 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 и до сих пор ничего хорошего.

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

ответ

1

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

-(void)showDeleteSheet:(id)sender 

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

self.curButton = sender; 

затем вызвать

[curButton setBackgroundImage:image]; 
+0

Спасибо Джо ... это делает трюк: [Отправитель setBackgroundImage: [UIImage imageNamed: @ "не загружен-Arrow.png"] Форстат: UIControlStateNormal] ; Теперь ... (всегда есть сейчас) ... если пользователь нажимает на отмену, изображение по-прежнему изменяется, потому что изменение изображения происходит в showDeleteSheet, а не в методе clickedButtonAtIndex. Конечно, я не могу получить отправителя. Есть предположения? –

+0

Нечетный, я могу установить фоновое изображение, но я не могу установить userInteractionEnabled в no, чтобы отключить кнопку с помощью \t [sender userInteractionEnabled = NO]; –

+0

Вы имеете в виду sender.userInteractionEnabled = NO; или [sender setUserInteractionEnabled: NO]; правильно ? –

Смежные вопросы