UITableView с несколькими элементами в каждой ячейке - PullRequest
4 голосов
/ 21 марта 2011

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

Вот код:

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

static NSString *CellIdentifier = @"Cell";
checkedImg = [UIImage imageNamed:@"buttonUnChecked1.png"];

UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}


//Set up the cell...
NSString *cellValue = [suggestions objectAtIndex:indexPath.row];

cell.selectionStyle = UITableViewCellSelectionStyleNone;

check = [UIButton buttonWithType:UIButtonTypeCustom];
check.frame=CGRectMake(0,35,20,20);
[check setImage:checkedImg forState:UIControlStateNormal];
[check addTarget:self action:@selector(checkClicked:) forControlEvents: UIControlEventTouchUpInside];
[cell.contentView addSubview:check];

cellContent = [[UILabel alloc]initWithFrame:CGRectMake(40,32,500,25)];
cellContent.text = cellValue;
[cell.contentView addSubview:cellContent];
return cell;
}


-(void)checkClicked:(UIButton *)b
{
checkedImg = [UIImage imageNamed:@"buttonChecked1.png"];
[check setImage:checkedImg forState:UIControlStateNormal];

}

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

Ответы [ 2 ]

3 голосов
/ 21 марта 2011

Структурированный способ получить результат, который вы ищете:

Создайте подкласс UIView для ячеек таблицы (содержащий кнопку и метку). Вы создаете эти пользовательские представления и устанавливаете их как contentView для каждой ячейки таблицы в cellForRowAtIndexPath.

Каждый из ваших пользовательских видов прослушивает нажатие собственной кнопки. Когда он был нажат, он переключает свое состояние и сообщает главному viewcontroller (через метод делегата), что он был переключен. Контроллер основного представления вызывает reloadData для рассматриваемой ячейки, чтобы перезагрузить ее с правильным внешним видом.

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

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

2 голосов
/ 21 марта 2011

Простой ответ на вашу проблему состоит в том, чтобы изменить свой метод checkClicked: следующим образом:

-(void)checkClicked:(UIButton *)b
{
    [b setImage:[UIImage imageNamed:@"buttonChecked1.png"] forState:UIControlStateNormal];
}

Но вы также должны настроить свой метод tableView:cellForRowAtIndexPath:, чтобы избежать повторного создания кнопки и очистки некоторыхпроблемы с памятью, как это:

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

static NSString *CellIdentifier = @"Cell";    

UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    UIButton *checkBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    checkBtn.frame = CGRectMake(0,35,20,20);
    [checkBtn setImage:[UIImage imageNamed:@"buttonUnChecked1.png"]; forState:UIControlStateNormal];
    [checkBtn addTarget:self action:@selector(checkClicked:) forControlEvents: UIControlEventTouchUpInside];
    [cell.contentView addSubview:checkBtn];

    UILabel *cellContentLbl = [[UILabel alloc]initWithFrame:CGRectMake(40,32,500,25)];
    cellContentLbl.tag = 1;
    [cell.contentView addSubview:cellContentLbl];
    [cellContentLbl release];
}


//Set up the cell...
NSString *cellValue = [suggestions objectAtIndex:indexPath.row];
cellContent = (UILabel *)[cell viewWithTag:1];
cellContent.text = cellValue;
return cell;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...