细节公开仅在tableview中选择单元格时作出反应

时间:2014-07-30 19:12:54

标签: ios uitableview core-data

我有一个表视图控制器和一个视图控制器。在表格视图控制器中,您可以添加联系人,然后将它带到视图控制器,您可以在那里设置人员姓名,电子邮件和电话。它使用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];

 }

更新

现在,当选择详细信息时,它会转到正确的信息。如果您单击另一个详细信息披露,它将转到相同的一个,直到它被关闭并再次完成。 例如,如果我打开应用程序并点击第三个对象的详细信息披露,它将进入第三个对象的编辑屏幕。如果我返回主菜单屏幕并单击第二个对象,则会转到第三个对象的编辑屏幕。如果我返回主菜单屏幕并再次单击第二个,它将正确地将我带到第二个对象的编辑屏幕。

提前致谢!

2 个答案:

答案 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)

修正了问题;刚刚更改了

中的indexPathForSelectedRow
  

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

到indexPathForCell:sender

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