'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
}
如果您希望在第三部分的第一行具有 仅 行为,您还应该检查 indexPath
的 section
。
if (indexPath.section == 2 && indexPath.row == 0)
您的枚举非常具有误导性;为什么要为 TotalComponents
分配 4
的值,为 TotalRows
分配 5
的值?我建议迁移到实际的数据结构。
此外,您已从 SectionOne
和 SectionTwo
切换为倒序 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 是第三行。也许检查选择器是否显示不是强制性的。
我正在努力实现
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
}
如果您希望在第三部分的第一行具有 仅 行为,您还应该检查 indexPath
的 section
。
if (indexPath.section == 2 && indexPath.row == 0)
您的枚举非常具有误导性;为什么要为 TotalComponents
分配 4
的值,为 TotalRows
分配 5
的值?我建议迁移到实际的数据结构。
此外,您已从 SectionOne
和 SectionTwo
切换为倒序 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 是第三行。也许检查选择器是否显示不是强制性的。