Как получить UITableViewCell изменить цвет фона, нажав UIBarButtonItem? - PullRequest
0 голосов
/ 11 января 2012

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

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

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

Вот код, который я использую для создания кнопки:

- (void)viewDidLoad {
    [super viewDidLoad];
    UIBarButtonItem *barButton;
    barButton = [[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"high.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(colorCells:)] autorelease];
    self.navigationItem.rightBarButtonItem = barButton; 
}

А здесь, чтобы выделить его, диапазон ячеек:

- (void) colorCells:(id)sender
{
    UITableViewCell *cell;
    NSString *cellValue = cell.textLabel.text; 
    if ([cellValue isEqual: @"textTheCellShouldBeEqualTo"]){ 
        cell.backgroundColor = [UIColor colorWithRed:251/255.0f green:255/255.0f blue:192/255.0f alpha:1]; ; 
        cell.imageView.image = [UIImage imageNamed:@"hot.png"];

    } 
    else { 
        cell.imageView.image = nil;
        cell.backgroundColor = [UIColor whiteColor];
    } 
}

Где янеудачу?Это должно работать нормально.Или же?Я что-то пропустил?Представление является UITableViewController.

РЕДАКТИРОВАТЬ

Я изменил свой код следующим образом:

- (void) colorCells:(id)sender{
    UITableViewCell *cell;
    NSInteger nSections = [self.tableView numberOfSections];
    for (int j=0; j<nSections; j++) {
        NSInteger nRows = [self.tableView numberOfRowsInSection:j];
        for (int i=0; i<nRows; i++) {
            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:j];
            cell = [self.tableView cellForRowAtIndexPath:indexPath];
        }
        NSString *cellValue = cell.textLabel.text; 
        if ([cellValue isEqual: @"textTheCellShouldBeEqualTo"] ){ 
            cell.backgroundColor = [UIColor colorWithRed:251/255.0f green:255/255.0f blue:192/255.0f alpha:1]; ; 
            cell.imageView.image = [UIImage imageNamed:@"hot.png"];

        } 
        else { 
            cell.imageView.image = nil;
            cell.backgroundColor = [UIColor whiteColor];
        } 
        [self.tableView reloadData];

    }
}

Теперь он не падает, но этоне окрашивает фон тоже.Есть идеи?

Ответы [ 2 ]

1 голос
/ 11 января 2012

Отображение цвета фона в ячейке кажется невероятно хрупким.Что определяет, что клетка должна быть выделена?Это изменится?Конечно, цвет фона соответствует определенному свойству объектов в вашем источнике данных.Более надежный подход заключается в использовании свойства NSMutableIndexSet в вашем классе для отслеживания набора индексов строк, требующих выделения при нажатии кнопки панели.

Рассмотрим этот пример.Я предполагаю, что rowsToHighlight является экземпляром NSMutableIndexSet, объявленным в вашем классе, и что он заполнен индексами строк, требующих выделения.Мы собираемся реализовать -tableView:willDisplayCell:forRowAtIndexPath: для настройки цвета фона ячейки в зависимости от того, является ли указанный путь индекса членом rowsToHighlight.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([self.rowsToHighlight containsIndex:indexPath.row])
    {
        cell.backgroundColor = [UIColor yellowColor];
    }
}

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

- (void)colorCells:(id)sender
{
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}
0 голосов
/ 11 января 2012

Ваши ячейки не будут перерисованы, если вы не скажете табличному представлению, в котором они содержатся, перезагрузить их. Вы можете сделать это одним из нескольких методов. Вы можете рассмотреть [someTableView reloadData] или один из этих методов .

Кроме того, объект вашей ячейки не тот, который находится в табличном представлении. Вы могли бы рассмотреть это:

- (void) colorCells:(id)sender
{
    UITableViewCell *cell;

    //grab a cell
    cell = [self  tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:someRow inSection:someSection]];
    NSString *cellValue = cell.textLabel.text; 
    if ([cellValue isEqual: @"textTheCellShouldBeEqualTo"]){ 
        cell.backgroundColor = [UIColor colorWithRed:251/255.0f green:255/255.0f blue:192/255.0f alpha:1]; ; 
        cell.imageView.image = [UIImage imageNamed:@"hot.png"];

    } 
    else { 
        cell.imageView.image = nil;
        cell.backgroundColor = [UIColor whiteColor];
    } 

   //perhaps you need to reload the table as well
   [self.tableView reloadData];
}
...