【问题标题】:Single row selection - UITableView单行选择 - UITableView
【发布时间】:2014-10-22 15:31:48
【问题描述】:

下午好,

我正在尝试在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];
    }
}

【问题讨论】:

  • 这里是晚上,晚上好。

标签: objective-c ios uitableview


【解决方案1】:

我猜你想一次只允许选择一行。

这是我在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 循环中执行所有操作:

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

希望这是你想要的!

【讨论】:

  • 感谢您的及时合作,正是我们所需要的。
  • 如果这对您有帮助,请点赞/标记为答案。我们都在努力通过我们提供的帮助来建立声誉。标记答案还可以帮助遇到相同问题的其他人,以便他们确切地知道什么对您有用。
【解决方案2】:

我使用的最短路径


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

【讨论】:

    猜你喜欢
    • 2010-11-13
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多