在viewDidLoad中我有:
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];
对于insertNewObjectMethod,我有:
- (void)insertNewObject:(id)sender
{
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
CommodityTypes *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
self.detailViewController.detailItem = newManagedObject;
self.detailViewController.context = context;
[self performSegueWithIdentifier:@"showCommodityTypesDetail" sender:sender];
}
还有:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showCommodityTypesDetail"]) {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
CommodityTypes *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];
NSManagedObjectContext *context = self.fetchedResultsController.managedObjectContext;
[[segue destinationViewController] setDetailItem:object];
[[segue destinationViewController] setContext:context];
}
}
当我建立&运行应用程序并选择它执行segue到详细信息页面的+按钮,但不加载newManagedObject信息。
我的猜测是performSegueWithIdentifier触发对prepareForSeque的调用,并且因为没有选定的行没有被加载,但是这个方法会覆盖早期的self.detailViewController.detailItem = newManagedObject; self.detailViewController.context = context;
我该如何解决这个问题? 首先猜测,insertNewObject创建newManagedObject。如何选择表中显示的行?
在这里开始iOS程序员。
尤里卡
self.detailViewController
是iPad拆分视图控制器使用的详细视图控制器实例 不 实例 > iPhone 界面。
performSegueWithIdentifier
向prepareForSegue
发送消息。为了解决我的问题,我必须做两件事。
从主视图控制器到详细视图控制器创建第二个segue。 原始seque从表视图行链接到详细视图控制器。第二个segue我从主视图控制器链接到详细视图控制器。 (使用Interface Builder中视图控制器的页脚中的视图控制器图标。)
在if语句中将对象创建行从insertNewObject
移动到prepareForSeque
,该语句选择第二个seque的唯一名称。
- (void)insertNewObject:(id)sender
{
[self performSegueWithIdentifier:@"ctAddButtonToDetail" sender:sender];
}
和
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"ctMasterRowToDetail"]) {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
CommodityTypes *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];
NSManagedObjectContext *context = self.fetchedResultsController.managedObjectContext;
[[segue destinationViewController] setDetailItem:object];
[[segue destinationViewController] setContext:context];
}
if ([[segue identifier] isEqualToString:@"ctAddButtonToDetail"]) {
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
CommodityTypes *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
[[segue destinationViewController] setDetailItem:newManagedObject];
[[segue destinationViewController] setContext:context];
}
}
答案 0 :(得分:1)
在insertNewObject:方法中,您有两行 -
self.detailViewController.detailItem = newManagedObject;
self.detailViewController.context = context;
...这表明你已经尝试初始化你要去的detailViewController。你不需要这样做,它是自动初始化的,因为你已经在故事板中链接了,并且你在prepareForSegue:sender:方法中传递了你想要的任何信息 - 实际上你正在这样做。
关于获取正确的数据,也许您可以在tableView的委托方法tableView:didSelectRowAtIndexPath:中执行此操作,并将ivar设置为所选行的行号,以便您可以在prepareForSegue:method中获取信息
答案 1 :(得分:0)
您正在向目标视图控制器提供该对象。您也不需要提供上下文...可以从对象本身获取(所有NSManagedObject都有一个managedObjectContext属性)。
看起来你正在传递信息。我不知道你对所选部分的意思。
在正在被选中的视图控制器上,您需要确保获取传入的数据... viewDidLoad是最常见的地方。