2015-04-25 3 views
2

У меня есть вопрос о UITAbleViewCell.UITableViewCell редактирует содержимое ячейки по клику

Я реализовал UITableViewDelegate метод

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; 

    cell.backgroundColor = [UIColor redColor]; 
    cell.textLabel.textColor = [UIColor redColor]; 
    cell.textLabel.text = @"Title"; 
} 

После нажатия на нужную ячейку, ничего не происходит ...

Почему это не работает, как я ожидал? Кроме того, что мне делать, чтобы заставить его работать?

ответ

1

Попробуйте это:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    // config the selected cell 
    .... 
} 

Вы должны спросить UITableView для ячейки непосредственно, а не просить его делегата (self в коде). Причина, по которой его делегат может удалить или создать новую ячейку, а не передать вам ячейку.

+0

Это то, что я безуспешно делаю (проверьте код примера) ... –

+0

@TomKortney внимательно прочитайте мой код. Я отправляю сообщение 'tableView' напрямую, а не' self'. – liushuaikobe

+0

Насколько я видел, этот ответ является самым простым и легким. Спасибо! –

2

Вы должны создать некоторую базовую модель для клеточных состояний: например

@property NSString *modelState = @"red"; // this is fast hint, but it can be a enum with states. 

все ячейки будут иметь один титул после крана.

... другой код ... Контроллер

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

     UITableViewCell *cell = [self.restaurantTable dequeueReusableCellWithIdentifier:@"cell_ID"]; 
// cell customization method   
     [self customizeCell:cell accordingToStateStr:modelState]; 

     return cell; 
    } 

... другой код ... Контроллер

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
     [tableView deselectRowAtIndexPath:indexPath animated:NO]; 

    // Set other state for cell 
     self.modelState = @"red"; 

    [tableView reloadData]; 
    } 

- (void)customizeCell:(UITableViewCell*)cell accordingToStateStr:(NSString *)str { 
    if ([str isEqualToString:@"red"]) { 
    cell.backgroundColor = [UIColor redColor]; 
    cell.textLabel.textColor = [UIColor redColor]; 
    cell.textLabel.text = @"Title"; 
    } else if(...) { 
    //Other options.. 
    } 
} 

[Tableview reloadData]; - снова вызовет метод cellForRow, и ваша таблица будет перерисована в соответствии с новой моделью.

Вы можете использовать для состояний ячеек элементов вместо объекта NSString (для вас это только эшафот).

+0

Понимаете, есть проблема, что мне нужно изменить не только текст. Мне также нужно изменить цвет текста текстовой метки ячейки и цвет фона ячейки ... –

+0

@TomKortney Для такого типа вещей я бы рекомендовал использовать некоторую модель для хранения данных для каждой ячейки. Затем вы можете определить цвета, текст и т. Д. В модели. Другим вариантом было бы иметь другой массив того же размера, содержащий логическое значение, которое сообщает вам, является ли ячейка первого стиля или второго стиля. Затем вы должны добавить оператор if для метода 'cellForRowAtIndexPath', чтобы установить стиль на основе этого логического. – Kyle

+0

Есть опция. Но я хотел бы знать, почему мой способ не работает? Кажется, это хорошо ... –

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