Выбор одной строки - UITableView - PullRequest
4 голосов
/ 23 сентября 2011

Добрый день,

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

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

    static NSString *EditCellIdentifier = @"EditCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:EditCellIdentifier];

    if (cell == nil) {

        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:EditCellIdentifier] autorelease];

        UILabel *label = [[UILabel alloc] initWithFrame:kLabelRect];
        label.tag = kCellLabelTag;
        [cell.contentView addSubview:label];
        [label release];

        UIImageView *imageView = [[UIImageView alloc] initWithImage:unselectedImage];
        imageView.frame = CGRectMake(5.0, 10.0, 23.0, 23.0);
        [cell.contentView addSubview:imageView];
        imageView.hidden = !inPseudoEditMode;
        imageView.tag = kCellImageViewTag;
        [imageView release];
    }

    [UIView beginAnimations:@"cell shift" context:nil];

    UIImageView *imageView = (UIImageView *)[cell.contentView viewWithTag:kCellImageViewTag];
    NSNumber *selected = [selectedArray objectAtIndex:[indexPath row]];
    imageView.image = ([selected boolValue]) ? selectedImage : unselectedImage;
    imageView.hidden = !inPseudoEditMode;
    [UIView commitAnimations];

    UILabel *label = (UILabel *)[cell.contentView viewWithTag:kCellLabelTag];
    label.text =[listOfItems objectAtIndex:[indexPath row]];
    label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
    label.opaque = NO;

    return cell;
}

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

[tv deselectRowAtIndexPath:indexPath animated:YES];

    if (inPseudoEditMode) {

        BOOL selected = [[selectedArray objectAtIndex:[indexPath row]] boolValue];
        [selectedArray replaceObjectAtIndex:[indexPath row] withObject:[NSNumber numberWithBool:!selected]];
        [tv reloadData];
    }
}

Ответы [ 2 ]

4 голосов
/ 23 сентября 2011

Полагаю, вы хотите разрешить выделение только одной строки за раз.

Вот что я предлагаю в tableView: didSelectRowAtIndexPath::

Пометить все строки как не выбранные:

for (int i = 0; i < [selectedArray count]; i++) {
    [selectedArray replaceObjectAtIndex:i withObject:[NSNumber numberWithBool:NO]];
}

Затем отметьте текущую строку как выбранную:

[selectedArray replaceObjectAtIndex:[indexPath row] withObject:[NSNumber numberWithBool:YES]];

ИЛИ, сделайте все то же самое для цикла:

for (int i = 0; i < [selectedArray count]; i++) {
    NSNumber rowSelected = [NSNumber numberWithBool:(indexPath.row == i)];
    [selectedArray replaceObjectAtIndex:i withObject:rowSelected];
}

Надеюсь, это то, что вы хотите!

1 голос
/ 22 октября 2014

Кратчайший путь, которым я пользуюсь


for (int i = 0; i < [selectedArray count]; i++) {
    [selectedArray replaceObjectAtIndex:i withObject:[NSNumber numberWithBool:i==indexpath.row?YES:NO]];
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...