我有一个表视图控制器和一个视图控制器。在表格视图控制器中,您可以添加联系人,然后将它带到视图控制器,您可以在那里设置人员姓名,电子邮件和电话。它使用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];
}
更新
现在,当选择详细信息时,它会转到正确的信息。如果您单击另一个详细信息披露,它将转到相同的一个,直到它被关闭并再次完成。 例如,如果我打开应用程序并点击第三个对象的详细信息披露,它将进入第三个对象的编辑屏幕。如果我返回主菜单屏幕并单击第二个对象,则会转到第三个对象的编辑屏幕。如果我返回主菜单屏幕并再次单击第二个,它将正确地将我带到第二个对象的编辑屏幕。
提前致谢!
答案 0 :(得分:0)
这看起来就像您只引用选定行的索引路径:
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]];
编辑: 根据您的设置方式以及如何设置数据源,您还可以从prepareForSegue中取出索引路径,并从获取的结果控制器/数组中获取NSManagedObject:
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
NSManagedObject *object = [[self fetchedResultsController]objectAtIndexPath:indexPath];
这对我来说完美无瑕。如果你仍然遇到问题,那就不是了。
答案 1 :(得分:0)
修正了问题;刚刚更改了
中的indexPathForSelectedRowNSManagedObject * selectedDevice = [self.contactarray objectAtIndex:[[self.tableView indexPathForSelectedRow] row]];
到indexPathForCell:sender
感谢Bernhard的帮助,你帮助我找出了问题所在。