Тип аксессуара ячейки не перезагружается на [tableview reloadData] - PullRequest
1 голос
/ 10 октября 2011

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

Я занимаюсь разработкой приложения для iPhone с двумя режимами просмотра.Первый вид имеет две кнопки, при нажатии одной из которых появляется всплывающее окно модального вида с табличным видом.Это табличное представление заполняется по-разному в зависимости от того, какая кнопка нажата.Если кнопка button1 нажата, представление таблицы заполняется кнопкой buttonData.Пользователь может выбрать ячейки, и если это сделано, тип аксессуара для ячеек устанавливается в UITableViewCellAccessoryCheckmark.Затем я сохраняю имя проверенных ячеек в tableViewListChecked, чтобы впоследствии можно было решить, какую ячейку следует проверять при изменении данных.

Проблема заключается в следующем: после закрытия модального окна, и я выбираю button2, ячейки, которые были выбраны в button1Data, все еще выбираются в button2Data.Для меня ясно, что функция [theTableView reloadData] работает, так как данные действительно меняются, однако accesorytupes остается прежним, пока я не прокручиваю ячейки с экранов.

PS Если я на самом деле прокручиваю ячейки экрана, там тип аксессуара установлен правильно.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    else if ([tableViewListChecked containsObject:[NSString stringWithString:cell.textLabel.text]]) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    }

    else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    cell.textLabel.text = [tableViewList objectAtIndex:indexPath.row];

    return cell;
}

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

    if (![tableViewListChecked containsObject:[NSString stringWithString:cell.textLabel.text]]) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        [tableViewListChecked addObject:[NSString stringWithString:cell.textLabel.text]];       
    }

    else if ([tableViewListChecked containsObject:[NSString stringWithString:cell.textLabel.text]]) {
        cell.accessoryType = UITableViewCellAccessoryNone;
        [tableViewListChecked removeObject:[NSString stringWithString:cell.textLabel.text]];
    }   
}

Спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 10 октября 2011

Если ячейка не равна нулю (если она была исключена из представления таблицы), то вы фактически не меняете тип аксессуара.Отбросьте остальное, т.е. измените

else if ([tableViewListChecked containsObject:[NSString stringWithString:cell.textLabel.text]]) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
}

на

if ([tableViewListChecked containsObject:[NSString stringWithString:cell.textLabel.text]]) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
}
0 голосов
/ 11 октября 2011

Если ребята здесь не помогли вам, вы можете просто установить: cell.accessoryType = UITableViewCellAccessoryNone каждый раз, когда пользователь нажимает кнопку2

0 голосов
/ 10 октября 2011

Звучит так, как будто вы повторно используете один и тот же экземпляр UITableView каждый раз, когда представляете модальное представление. В таком случае, что происходит с массивом tableViewListChecked? Вы меняете данные в tableViewList; но вы используете какую-то стратегию, чтобы сохранить список отмеченных пунктов между нажатиями на button1 и button2?

...