insertNewObject seque到detailViewController with newManagedObject

时间:2012-04-14 16:31:43

标签: objective-c ios uistoryboard uistoryboardsegue

在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];

    }
}

2 个答案:

答案 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是最常见的地方。