我正致力于实施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'被选中了?谢谢!
答案 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)
分配值TotalComponents
和4
TotalRows
的值?我建议迁移到实际的数据结构。
此外,您已从5
和SectionOne
切换为反向排序SectionTwo
。为什么呢?
答案 4 :(得分:0)
您只测试该行,如果您有不同的部分,则还必须测试该部分。