【问题标题】:UITableView cannot select any two cells (n * 9) cells appartUITableView 不能选择任何两个单元格 (n * 9) 单元格
【发布时间】:2016-01-28 17:33:16
【问题描述】:

我有一个使用情节提要中的原型单元格创建的多选 UITableView。我可以进行多项选择,

我发现如果我选择第 0 行中的单元格,我将无法选择 9 行以外的任何单元格。即 9、18、27 等。

如果我取消选择 0,我就可以选择第 9 行。但是,这样做会使第 0、18、27 等行无法选择。

我已经实现了以下用于记录的委托方法,但是,当单击这些无响应的单元格时,不会调用此方法。

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if([[tableView cellForRowAtIndexPath:indexPath] isSelected]) {
        NSLog(@"Already Selected");
    } else {
        NSLog(@"New Select");
    }
    return indexPath;
}

我在 iOS8.3 iPhone 6 Plus、iOS9.2 iPhone 6S 和 iOS9.2 iPhone 5S 上进行了测试,结果相同,距离相同。

我不认为任何时候都有 9 个单元格可以显示在屏幕上是巧合。我认为它与单元格出列和重用有关,但我无法确认。

有没有人知道我错过了什么?

编辑:包括tableView:cellForRowAtIndexPath

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    DKIFriendTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier forIndexPath:indexPath];

    NSArray *array;

    switch ([indexPath section]) {
        case 0:
            array = [recommendedFilteredList objectAtIndex:[indexPath row]];
            break;

        case 1:
            array = [fullFilteredList objectAtIndex:[indexPath row]];
            break;

        default:
            return nil;
            break;
    }

    BOOL selected = [selectedUsers containsObject:[array objectAtIndex:0]];

    // Due to conflicts with searching table, set whether cell is selected or not.
    if(selected)
        [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    else
        [tableView deselectRowAtIndexPath:indexPath animated:NO];

    [cell setNameText:[array objectAtIndex:1]];
    [cell setProfilePictureImage:[UIImage imageWithData:[[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[array objectAtIndex:2]]options:NSDataReadingMappedIfSafe error:nil]]];

    return cell;
}

可能值得一提的是,无论选择的布尔值是否被检查和实现,问题仍然存在。如果没有实现,搜索结果单元格不会以突出显示的方式返回。

编辑:包含numberOfSectionsInTableView: 委托方法,以获取与tableView:cellForRowAtIndexPath 方法相关的更多信息。

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 2;
}

编辑:添加示例项目 BitBucket 存储库链接

在处理掉我以前拥有的代码并尝试从头开始重新创建视图之后,我仍然遇到了同样的问题。然后,我在一个新的、单独的项目中再次只创建了项目的这一部分,但我仍然遇到了同样的问题(这次是通过不同的分隔 - n * 12 而不是 n * 9)。

Sample Project BitBucket link

【问题讨论】:

  • 可能与滚动有关,并且在同一个地方有“阻止用户交互”吗?我的意思是,如果你再滚动一点,它仍然无法选择吗?
  • 不,很遗憾没有。无论它在视图中的哪个位置,如果它与所选单元格之一相距 9(或多个),它仍然无法选择。一旦第一个选中的单元格被取消选中,第二个单元格现在就可以选择了。
  • 可以分享-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法
  • 当然,方法编辑成原始问题。
  • 如果您有超过 2 个部分,单元格将 return nil。因此,您的 willSelectRowAtIndexPath: 方法将永远不会被调用。

标签: ios objective-c uitableview storyboard


【解决方案1】:

我检查了一个项目并发现了问题。

- (void) setSelected:(BOOL)selected {
    [_tickImage setHidden:!selected];
}

你覆盖了 tableviewcell 的一个方法,但是没有调用 super 函数。完成此操作后,选择/取消选择中的所有流程都按照您的意愿进行。

- (void) setSelected:(BOOL)selected {
    [super setSelected:selected];
    [_tickImage setHidden:!selected];
}

【讨论】:

  • 我知道我愚蠢地错过了一些东西,我只是看不出我没有做什么!与您的解决方案完美搭配。非常感谢,甲。谢谢。
【解决方案2】:

您的错误是认为[[tableView cellForRowAtIndexPath:indexPath] isSelected] 是查看是否选择了行的有效方法。

如果indexPath 处的行没有可见单元格,则[tableView cellForRowAtIndexPath:indexPath] 返回 nil。在 Objective-C 中,您可以向 nil 发送任何消息,并返回 nil/false/0。因此,如果indexPath 处的行没有可见单元格,您的测试将始终返回 false,表示该行未被选中。

判断表格视图是否认为某行被选中的正确方法是询问表格视图选择了哪些行:

if ([tableView.indexPathsForSelectedRows containsObject:indexPath]) {
    // row is selected
}

【讨论】:

  • 嗨 Rob,我唯一使用 isSelected 的地方是在 -tableView: willSelectRowAtIndexPath: 方法期间确定要打印的日志消息,它不会运行任何逻辑来调整返回的 indexPath。在我的问题中,所有单元格都在显示,并且在被选中时,它们仍显示为选中状态。但是,尝试选择远离先前选择的行的行 (n * 9) 不会触发任何委托方法。所以只要选择了第 0 行,第 10 行就无法选择。一旦取消选择第 0 行,第 10 行就可以被选中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多