仅当在表格视图中选择单元格时,详细信息披露才会做出反应
Posted
技术标签:
【中文标题】仅当在表格视图中选择单元格时,详细信息披露才会做出反应【英文标题】:Detail disclosure only reacts when cell is selected in tableview 【发布时间】:2014-07-30 19:12:54 【问题描述】:我有一个表视图控制器和一个视图控制器。在表格视图控制器中,您可以添加联系人,然后它会将您带到视图控制器,在那里您可以设置人员的姓名、电子邮件和电话。它使用 Core Data 保存数据。之前,我这样做是为了当您按下表格视图单元格时,它会将您带到同一个视图控制器,但字段已经填写了联系人的信息并且可以进行编辑。然后这些被保存并且联系人的新信息将被更新。现在,我对其进行了更改,因此有一个详细信息披露按钮,当按下该按钮时,它应该具有与以前点击单元格相同的功能。如果我按下详细信息披露按钮,即使我选择了第三个对象,也会弹出 tableView 中第一个对象的编辑屏幕。在模拟器上,如果我单击单元格,则单元格只会按应有的方式突出显示自身,并且没有其他功能。选中单元格并单击详细信息显示按钮后,将转到正确对象的编辑屏幕。
例如; 如果我单击 tableView 中第四个对象的详细信息披露按钮,它会将我带到第一个对象的编辑屏幕。如果我单击单元格并在选择该单元格时单击详细信息披露按钮,它会将我带到第四个对象的编辑屏幕。
调用细节披露的函数:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([[segue identifier] isEqualToString:@"UpdateContacts"])
NSManagedObject *selectedDevice = [self.contactarray objectAtIndex:[[self.tableView indexPathForSelectedRow] row]];
MyDetailViewController *destViewController = segue.destinationViewController;
destViewController.contactdb = selectedDevice;
为具有索引路径的行点击的辅助按钮
NSInteger selectedRow;
-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath selectedRow = indexPath.row;
[self performSegueWithIdentifier:@"UpdateContacts" sender:self];
viewDidAppear (contains FetchRequest)
-(void) viewDidAppear:(BOOL)动画
[super viewDidAppear:animated]; NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Contacts"]; self.contactarray = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
[self.tableView reloadData];
更新
现在,选择详细信息时,它将到正确的。如果您单击另一个详细信息披露,它会转到同一个,直到它被关闭并再次完成。 例如,如果我打开应用程序并点击第三个对象的详细信息披露,它会转到第三个对象的编辑屏幕。如果我返回主菜单屏幕并单击第二个对象,它会将我带到第三个对象的编辑屏幕。如果我返回主菜单屏幕并再次单击第二个,它会正确地将我带到第二个对象的编辑屏幕。
提前致谢!
【问题讨论】:
你能给我们看看你在didSelectRowAtIndexPath和accessoryButtonTappedForRowWithIndexPath中的一些代码吗 添加了附件ButtonTappedForRowWithIndexPath,我没有 didSelectRowAtIndexPath。 【参考方案1】:这看起来您只引用了选定行的索引路径:
NSManagedObject *selectedDevice = [self.contactarray objectAtIndex:[[self.tableView indexPathForSelectedRow] row]];
您可以为 indexPath 添加一个属性,将其设置在“accessoryButtonTappedForRowWithIndexPath:”中并使用它来代替 [self.tableView indexPathForSelectedRow]。
在你的头文件中创建一个 NSIndexPath 类型的属性。看起来像这样:
@property (strong, nonatomic) NSIndexPath *yourIndexPath;
在“accessoryButtonTappedForRowWithIndexPath:”方法中设置 indexPath:
_yourIndexPath = indexPath;
在你的 segue 中你的引用数组是这样的:
NSManagedObject *selectedDevice = [self.contactarray objectAtIndex:[_yourIndexPath.row]];
编辑: 根据您的 segue 方式和数据源设置方式,您还可以从 prepareForSegue 中找出索引路径,并从获取的结果控制器/数组中获取 NSManagedObject:
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
NSManagedObject *object = [[self fetchedResultsController]objectAtIndexPath:indexPath];
这对我来说完美无缺。如果你仍然遇到问题,那就不是这样了。
【讨论】:
“为 indexPath 添加属性”是什么意思?抱歉,我是 ios 编码的新手 在你的头文件中创建一个 NSIndexPath 类型的属性。看起来像这样:@property (strong, nonatomic) NSIndexPath *yourIndexPath;在“accessoryButtonTappedForRowWithIndexPath:”方法中设置 indexPath:_yourIndexPath = indexPath;在您的 segue 中,您引用这样的数组: NSManagedObject *selectedDevice = [self.contactarray objectAtIndex:[_yourIndexPath.row]; 当我尝试这样做时,它给了我错误“预期标识符”,顺便说一句,最后是两个括号:[_yourIndexPath.row]]; :) 我认为我们走在正确的轨道上 NSManagedObject *selectedDevice = [self.contactarray objectAtIndex:[_newindexPath.row]];行 它说length = 2, path = 0 - 0,根据我按下的表中的哪个对象增加length = 2, path = 0 - 1, length = 2、路径=0-2等【参考方案2】:修复了问题;刚刚在
中更改了 indexPathForSelectedRowNSManagedObject *selectedDevice = [self.contactarray objectAtIndex:[[self.tableView indexPathForSelectedRow] row]];
到 indexPathForCell:sender
感谢 Bernhard 的帮助,你帮我找出了问题所在。
【讨论】:
很高兴,因为代码 sn-p 在下面的答案中,请接受我的答案。以上是关于仅当在表格视图中选择单元格时,详细信息披露才会做出反应的主要内容,如果未能解决你的问题,请参考以下文章
当在 UITableView(在另一个笔尖/视图上)上按下单元格时,如何导航到笔尖(视图)?
在每个单元格都包含表格视图的表格视图中选择新单元格时,无法取消选择先前选择的单元格