除非多次点击行,否则不会调用UITableView DidSelectRow

时间:2016-01-24 01:57:16

标签: ios objective-c uitableview

好的,首先我知道这个问题已被多次询问,但这些问题都没有给我正确答案。

我有一个TableView,当我选择一行时,除非在20到50次之间挖掘了行,否则不会调用didSelectRowAtIndexPath。这很奇怪,在调用方法之前,我必须疯狂地敲击表格大约50次。我无法解决可能导致这种奇怪行为的原因。

让我建立一些事情:

  • 是的我打电话给DidSelect而不是DidDeselect
  • Tableview数据源和委托通过接口构建器连接起来,我甚至在ViewDidLoad中调用tableview.datasource和tableview.delegate以确保。
  • 启用了UserInteraction。
  • 所有其他tableView委托方法完全按预期工作
  • 我甚至删除了tableView并再次创建它,以确保我没有改变任何我不应该做的事情。
  • tableView由三个部分组成,前两个是包含UICollectionViews的单元格,它们工作正常,collectionView didSelectItemAtIndexPath方法也可以正常工作。第三部分是我遇到问题的部分,也是唯一需要处理tableView行选择的部分

这是我的tableView方法:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    if (hasFinishedQuery == NO) {
        return 0;
    }
    else{
        return 3;
    }
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (section == 2) {
        return quickLinksArray.count;
    }
    else {
        return 1;
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 2) {
        NSDictionary *dic = [quickLinksArray objectAtIndex:indexPath.row];
         NSString *cellidentifier = [dic objectForKey:@"title"];

        UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellidentifier];

        if (!cell)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellidentifier];
        }
        NSNumber *countNumber = [dic valueForKey:@"count"];
        UILabel *label = (UILabel *)[cell viewWithTag:3];
        [label setText:[NSString stringWithFormat:@"%@", countNumber]];
        label.layer.cornerRadius = 18;
        label.layer.masksToBounds = YES;

        return cell;

    }
    else{
        static NSString *cellidentifier = @"cellidentifier";

        TableViewCell *cell = (TableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellidentifier];

        if (!cell)
        {
            cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellidentifier];
        }

        return cell;
    }
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(TableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section != 2) {
        [self insertDatasourceAndDelegateForCell:cell forRowAtIndexPath:indexPath andCellType:NO];
    }
}

- (void) insertDatasourceAndDelegateForCell:(TableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath andCellType:(BOOL)cellType
{
    if (indexPath.section != 2) {
        [cell setCollectionViewDataSourceDelegate:self index:indexPath.section andCellType:cellType];
        NSInteger index = cell.collectionViewHorizontal.tag;

        CGFloat horizontalOffset = [self.contentOffsetDictionary[[@(index) stringValue]] floatValue];
        [cell.collectionViewHorizontal setContentOffset:CGPointMake(horizontalOffset, 0)];
    }
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"Cell Tapped");
    selectedDictionary = [quickLinksArray objectAtIndex:indexPath.row];
    [self performSegueWithIdentifier:@"goToListView" sender:self];
}

如果您想查看任何其他代码,请告诉我,

希望你能提供帮助, 谢恩

1 个答案:

答案 0 :(得分:0)

好的简单错误。我创建了一个UITableViewCell的子类,它被设计用于包含我的collectionViews的单元格。出于某种原因,我将所有tableViewCells设置为该子类,甚至是那些不应该的子类。在界面构建器中,我将单元格类更改回原始的UITableViewCell,现在它按预期处理选择。

我从中学到的经验教训:

  1. 我已经命名了UITableViewCell的一个子类" TableViewCell"。这是一个愚蠢的举动,因为它与UITableViewCell太相似,并且很难发现这个错误。
  2. 在创建单元格时,我只复制了我已创建的单元格,而不是将新单元格放入视图中。如果我只是将新细胞放入视图中而不是采取简单的方法,那就不会发生这种情况。