как установить accessoryType, когда ячейка была выбрана - PullRequest
4 голосов
/ 08 сентября 2011

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

Если вы знаете, как это сделать, или хороший учебник, пожалуйста, дайте мне знать, что это было бы здорово.

Ответы [ 5 ]

10 голосов
/ 08 сентября 2011

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

Во-первых, в вашем файле .h должен быть объявлен глобальный путь индекса для отслеживания уже выбранной ячейки ->

NSIndexPath *oldIndexPath;

При создании ячеек обязательно укажите тип аксессуара none, чтобы по умолчанию ни одна ячейка не была выбрана при просмотре таблицы;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CallIdentifier"];
        cell.accessoryType = UITableViewCellAccessoryNone;      
    }
    return cell; 
}

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

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    if (oldIndexPath==nil) { // No selection made yet
        oldIndexPath=indexPath;
        [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
    }
    else {
        UITableViewCell *formerSelectedcell = [tableView cellForRowAtIndexPath:oldIndexPath]; // finding the already selected cell
        [formerSelectedcell setAccessoryType:UITableViewCellAccessoryNone];

        [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; // 'select' the new cell
        oldIndexPath=indexPath;
    }   
}

Надеюсь, это сработает! :)

2 голосов
/ 08 сентября 2011

Примерно так может работать:

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

Чтобы ответить на комментарий ниже, просто нажмите viewController таким же способом, как этот:

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

    // Then push a new view
    iPhoneCustomViewController *myVC = [[iPhoneCustomViewController alloc] initWithNibName:@"iPhoneCustomViewController" bundle:nil];
    [self.navigationController pushViewController:myVC animated:YES];
    [myVC release];

    // And deselect the row (if desired)
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}
1 голос
/ 01 июня 2014

Знаете ли вы, что:

1.) UITableView отслеживает пути индекса для выбранных строк?Он находится в массиве indexPathsForSelectedRows

2.) UITableView имеет флаг, который можно установить, чтобы сделать его одним или несколькими вариантами выбора.Вы можете изменить его, вызвав метод setAllowsMultipleSelection: (BOOL).

Итак, предположив, что для таблицы задан один выбор, мы можем сделать следующее в методе tableView: CellForRowAtIndexPath ...

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

static NSString *simpleTableIdentifier = @"CellIdentifier";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

[[cell textLabel] setText:@"Some Text"];

NSArray *selectedIndexPaths = [tableView indexPathsForSelectedRows];

if ([selectedIndexPaths containsObject:indexPath]) {
    [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
}else{
    [cell setAccessoryType:UITableViewCellAccessoryNone];
}

return cell;}

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

Нет необходимости создавать отдельные ивары или что-либо еще, чтобы отслеживать то, что было или не было 'т выбран.Все это аккуратно содержится в UITableView, как и предполагал Apple.

0 голосов
/ 08 сентября 2011

Из документов :

Делегат обрабатывает выборки в этом методе.Одна из вещей, которую он может сделать, - это исключительно назначить изображение галочки (UITableViewCellAccessoryCheckmark) одной строке в разделе (стиль радио-списка).Этот метод не вызывается, когда для свойства редактирования таблицы установлено значение YES (то есть представление таблицы находится в режиме редактирования).Посмотрите "Управление Выборами" в Руководстве по программированию Табличного представления для iOS для получения дополнительной информации (и примеров кода), связанных с этим методом.

Вот пример:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]
   cell.UITableViewAccessoryType = UITableViewCellAccessoryCheckmark;
}
0 голосов
/ 08 сентября 2011
UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];
 newCell.accessoryType=UITableViewCellAccessoryCheckmark;

Реализуйте это в методе делегата didSelectRowAtIndexPath

...