'didSelectRowAtIndexPath'检测到太多行

时间:2015-02-06 20:39:25

标签: ios objective-c uitableview didselectrowatindexpath

我正致力于实施inline date picker in a table view。但是,我正在努力解决问题,并选择了“做出选择路线”和“快速路径”。

tableView的节和行使用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'如果用户选择,将显示日期选择器。我使用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];
}

但是,根据我的记录结果,当我依次选择每一行时,似乎这个方法不仅仅被调用,如果' ThirdSectionFirstRow'被选中,但如果' FirstSectionFirstRow'和' SecondSectionFirstRow'。任何人都可以帮助我发现我的逻辑中的缺陷,以便只有在' ThirdSectionFirstRow'被选中了?谢谢!

5 个答案:

答案 0 :(得分:1)

假设您正在讨论实际的tableview部分,那么您不会测试仅部分行,因此您描述的行为是正确的(也就是说,匹配的任何行都是您的if的成功条件)。

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

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

答案 1 :(得分:1)

基本上你没有比较indexPath的部分,你只是将行与ENUM进行比较,改变了下面的条件,如第三部分第一行,

- (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(indexPath.section)
{
  case SectionOne:
    if(indexPath.row==0)
     {
      [self showDatePickerCell];
     }
   break;
  case SectionTwo:
   break;
}

答案 2 :(得分:1)

Narner,方法" didSelectRowAtIndexPath"每次点击任何表行时都会触发,因此你的逻辑很好,因为你有一个IF来检测被点击的行何时是第三行。另一方面," row"属性" indexPath"是一个NSInteger,所以可能是表达式"(indexPath.row == ThirdSectionFirstRow&& self.datePickerIsShowing == NO)"没有给你预期的结果,为什么你不改变它为#34;(indexPath.row == 2)",2是第三行。也许并不是必须检查选择器是否正在显示。

答案 3 :(得分:0)

如果您想在第三部分的第一行中只有行为,那么您也应该检查section的{​​{1}}。

indexPath

你的枚举很容易误导;为什么要为if (indexPath.section == 2 && indexPath.row == 0) 分配值TotalComponents4 TotalRows的值?我建议迁移到实际的数据结构。

此外,您已从5SectionOne切换为反向排序SectionTwo。为什么呢?

答案 4 :(得分:0)

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