'didSelectRowAtIndexPath' 检测到太多行

'didSelectRowAtIndexPath' detecting too many rows

我正在努力实现 。但是,我正在努力解决 'didSelectRowAtIndexPath'.

的问题

tableView的sections和rows是使用NS_ENUM定义的,如下图:

typedef NS_ENUM(NSInteger, SectionOne)
{
    SectionOneFirstRow = 0,
    SectionOneSecondRow,
    TotalSectionOneRows
};

typedef NS_ENUM(NSInteger, SectionTwo) {
    SectionTwoFirstRow = 0,
    SectionTwoSecondRow,
    SectionTwoThirdRow,
    SectionTwoFourthRow,
    TotalSectionTwoRows
};

typedef NS_ENUM(NSInteger, ThirdSection) {
    ThirdSectionFirstRow = 0,
    TotalThirdSectionRows
};

typedef NS_ENUM(NSInteger, Section) {
    SectionOne = 0,
    SectionTwo,
    SectionThree,
    TotalSections,
    TotalComponents,
    TotalRows
};

然后,我实现了 'didSelectRowAtIndexPath',这样如果 'ThirdSectionFirstRow' 被用户 select 编辑,就会显示一个日期选择器。我正在使用 NSLog 来帮助我调试。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == ThirdSectionFirstRow && self.datePickerIsShowing == NO){
        NSLog(@"Row selected");
        [self showDatePickerCell];
    } else{
        [self hideDatePickerCell];
    }
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
}

但是,根据我依次 select 每一行时的日志记录结果,似乎不仅在 'ThirdSectionFirstRow' 被 selected 时调用此方法,而且如果'FirstSectionFirstRow' 和 'SecondSectionFirstRow'。任何人都可以帮助我发现我的逻辑中的缺陷,以便仅当 'ThirdSectionFirstRow' 被 selected 时才调用此方法吗?谢谢!

假设您谈论的是实际的 tableview 部分,您没有测试部分 -- 只有行,所以您描述的行为是正确的(也就是说,任何匹配的行都是成功的条件你的如果)。

在伪代码中,您需要执行以下操作:

if ((indexPath.section == thirdSection) && (indexPath.row == firstRow) && (any other required conditions)) {
    // do stuff here
}

如果您希望在第三部分的第一行具有 行为,您还应该检查 indexPathsection

if (indexPath.section == 2 && indexPath.row == 0)

您的枚举非常具有误导性;为什么要为 TotalComponents 分配 4 的值,为 TotalRows 分配 5 的值?我建议迁移到实际的数据结构。

此外,您已从 SectionOneSectionTwo 切换为倒序 ThirdSection。为什么?

基本上你不是在比较 indexPath 的部分,你只是在比较行与 ENUM 改变条件,如下面的 ThirdSectionFirstRow,

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == SectionThree && indexPath.row == 0 && self.datePickerIsShowing == NO){
        NSLog(@"Row selected");
        [self showDatePickerCell];
    } else{
        [self hideDatePickerCell];
    }
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
}

如果条件太多最好使用 switch case,比如

switch(indexPath.section)
{
  case SectionOne:
    if(indexPath.row==0)
     {
      [self showDatePickerCell];
     }
   break;
  case SectionTwo:
   break;
}

您只测试该行,如果您有不同的部分,则还必须测试该部分。

Narner,每次你点击任何 table 行时都会触发方法 "didSelectRowAtIndexPath",所以你的逻辑是好的,因为你有一个 IF 来检测点击的行何时是第三行。另一方面,"indexPath" 的 "row" 属性 是一个 NSInteger,所以表达式“(indexPath.row == ThirdSectionFirstRow && self.datePickerIsShowing == NO) " 没有给你预期的结果,你为什么不把它改成 "( indexPath.row == 2 )",2 是第三行。也许检查选择器是否显示不是强制性的。