UITableView无法选择任何两个单元格(n * 9)单元格

时间:2016-01-28 17:33:16

标签: ios objective-c uitableview storyboard

我有一个多选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

2 个答案:

答案 0 :(得分:2)

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

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

重写tableviewcell的方法但不称为super函数。完成此操作后,选择/取消选择中的所有流程都会按您的意愿行事。

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

答案 1 :(得分:0)

您的错误是认为[[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
}