仅当在表格视图中选择单元格时,详细信息披露才会做出反应

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】:

修复了问题;刚刚在

中更改了 indexPathForSelectedRow

NSManagedObject *selectedDevice = [self.contactarray objectAtIndex:[[self.tableView indexPathForSelectedRow] row]];

到 indexPathForCell:sender

感谢 Bernhard 的帮助,你帮我找出了问题所在。

【讨论】:

很高兴,因为代码 sn-p 在下面的答案中,请接受我的答案。

以上是关于仅当在表格视图中选择单元格时,详细信息披露才会做出反应的主要内容,如果未能解决你的问题,请参考以下文章

当在 UITableView(在另一个笔尖/视图上)上按下单元格时,如何导航到笔尖(视图)?

在每个单元格都包含表格视图的表格视图中选择新单元格时,无法取消选择先前选择的单元格

具有标题和详细信息字段的自调整表格视图单元格

在没有自定义单元格的情况下向 uitableview 显示详细信息披露按钮

当我选择表格视图单元格时无法推送我的视图控制器

在选择表格视图单元格时更改按钮的标题