accessoryButtonTappedForRow 在模拟器上调用但不在设备上调用
accessoryButtonTappedForRow called on Simulator but not Device
我有一个自定义的 tableView 设置,它不对单元格进行出列。我没有在情节提要中使用静态单元格,因为我使用的是包含 tableView 的 UIViewController。无论如何设置如下:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
// Array > Dictionary > cell.textLabel.text info here
switch (indexPath.section) {
case 0:
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
switch (indexPath.row) {
case 4:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.accessoryType = UITableViewCellAccessoryDetailButton;
//etc etc
单元格的设置与上面的代码所示相同。
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
NSIndexPath *pubdisclaimer = [NSIndexPath indexPathForRow:2 inSection:2];
NSIndexPath *maintenanceInfo = [NSIndexPath indexPathForRow:4 inSection:0];
if (indexPath == pubdisclaimer) {
NSLog(@"Disclaimer Tapped");
//Show UIAlertController
} else if (indexPath == maintenanceInfo) {
NSLog(@"Maintenance tapped");
//Show Different UIAlertController
} else {
//
}
}
accessoryButtonTapped 在模拟器中被检测到(并且不同的 UIAlertControllers 相应地填充)但是,当在与模拟器相同的部署目标的设备上运行时,除了按钮突出显示之外没有任何反应。这适用于一个 indexPath,但当我包含 else if 语句时,它不会在设备上调用。
仅供参考,所有 tableView 委托和数据源都已正确设置为文件所有者。就像我说的那样,在我添加第二个 NSIndexPath 之前一切正常,这让我相信这就是问题所在。但如果是这样,为什么它在模拟器中可以完美运行,甚至可以区分两个不同的按钮索引?我想我在这里遗漏了一些简单的东西。如何解决问题?
编辑 记录索引路径:
模拟器返回
2015-01-05 21:42:54.666 [38440:9202972] didSelectRowAtIndexPath section: 0, row: 4
2015-01-05 21:42:57.993 [38440:9202972] accessoryButtonTapped section: 0, row: 4
2015-01-05 21:43:04.765 [38440:9202972] didSelectRowAtIndexPath section: 2, row: 2
2015-01-05 21:43:08.185 [38440:9202972] accessoryButtonTapped section: 2, row: 2
设备退货
2015-01-05 21:45:17.564 [4072:1128326] didSelectRowAtIndexPath section: 0, row: 4
2015-01-05 21:45:19.763 [4072:1128326] Nothing tapped : else
2015-01-05 21:45:28.613 [4072:1128326] didSelectRowAtIndexPath section: 2, row: 2
2015-01-05 21:45:29.313 [4072:1128326] Nothing tapped : else
改变if
条件,分别分解为row
和section
。
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
// PubDisclaimer
if ((indexPath.row == 2 && indexPath.section == 2)) {
NSLog(@"Disclaimer Tapped");
//Show UIAlertController
}
// MaintenanceInfo
else if ((indexPath.row == 4 && indexPath.section == 0)) {
NSLog(@"Maintenance tapped");
//Show Different UIAlertController
}
else {
NSLog(@"Nothing tapped");
}
}
希望对您有所帮助。
==
用于对象测试指针相等性,而不是 "does this index path have the same row and section as that one"。
如果它在模拟器上工作,那是运气,不应该依赖,可能一些低编号的索引路径被缓存,就像一些低编号的 NSNumbers 是为了提高效率。您应该将对象与 isEqual:
:
进行比较
if ([indexPath isEqual:maintenanceInfo])
我有一个自定义的 tableView 设置,它不对单元格进行出列。我没有在情节提要中使用静态单元格,因为我使用的是包含 tableView 的 UIViewController。无论如何设置如下:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
// Array > Dictionary > cell.textLabel.text info here
switch (indexPath.section) {
case 0:
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
switch (indexPath.row) {
case 4:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.accessoryType = UITableViewCellAccessoryDetailButton;
//etc etc
单元格的设置与上面的代码所示相同。
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
NSIndexPath *pubdisclaimer = [NSIndexPath indexPathForRow:2 inSection:2];
NSIndexPath *maintenanceInfo = [NSIndexPath indexPathForRow:4 inSection:0];
if (indexPath == pubdisclaimer) {
NSLog(@"Disclaimer Tapped");
//Show UIAlertController
} else if (indexPath == maintenanceInfo) {
NSLog(@"Maintenance tapped");
//Show Different UIAlertController
} else {
//
}
}
accessoryButtonTapped 在模拟器中被检测到(并且不同的 UIAlertControllers 相应地填充)但是,当在与模拟器相同的部署目标的设备上运行时,除了按钮突出显示之外没有任何反应。这适用于一个 indexPath,但当我包含 else if 语句时,它不会在设备上调用。
仅供参考,所有 tableView 委托和数据源都已正确设置为文件所有者。就像我说的那样,在我添加第二个 NSIndexPath 之前一切正常,这让我相信这就是问题所在。但如果是这样,为什么它在模拟器中可以完美运行,甚至可以区分两个不同的按钮索引?我想我在这里遗漏了一些简单的东西。如何解决问题?
编辑 记录索引路径:
模拟器返回
2015-01-05 21:42:54.666 [38440:9202972] didSelectRowAtIndexPath section: 0, row: 4
2015-01-05 21:42:57.993 [38440:9202972] accessoryButtonTapped section: 0, row: 4
2015-01-05 21:43:04.765 [38440:9202972] didSelectRowAtIndexPath section: 2, row: 2
2015-01-05 21:43:08.185 [38440:9202972] accessoryButtonTapped section: 2, row: 2
设备退货
2015-01-05 21:45:17.564 [4072:1128326] didSelectRowAtIndexPath section: 0, row: 4
2015-01-05 21:45:19.763 [4072:1128326] Nothing tapped : else
2015-01-05 21:45:28.613 [4072:1128326] didSelectRowAtIndexPath section: 2, row: 2
2015-01-05 21:45:29.313 [4072:1128326] Nothing tapped : else
改变if
条件,分别分解为row
和section
。
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
// PubDisclaimer
if ((indexPath.row == 2 && indexPath.section == 2)) {
NSLog(@"Disclaimer Tapped");
//Show UIAlertController
}
// MaintenanceInfo
else if ((indexPath.row == 4 && indexPath.section == 0)) {
NSLog(@"Maintenance tapped");
//Show Different UIAlertController
}
else {
NSLog(@"Nothing tapped");
}
}
希望对您有所帮助。
==
用于对象测试指针相等性,而不是 "does this index path have the same row and section as that one"。
如果它在模拟器上工作,那是运气,不应该依赖,可能一些低编号的索引路径被缓存,就像一些低编号的 NSNumbers 是为了提高效率。您应该将对象与 isEqual:
:
if ([indexPath isEqual:maintenanceInfo])