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


当我构建并运行该应用程序并选择+按钮时,它会转到详细信息页面,但不会加载newManagedObject信息。

我的猜测是performSegueWithIdentifier会触发对prepareForSeque的调用,并且由于没有选定的行,因此不会加载任何内容,但是此方法将覆盖较早的self.detailViewController.detailItem = newManagedObject;
        self.detailViewController.context =上下文;

我该如何解决?
首先猜测,insertNewObject创建newManagedObject。如何选择表格中显示的行?

从这里开始iOS程序员。

尤里卡
self.detailViewController是iPad拆分视图控制器使用的详细视图控制器实例,而不是iPhone界面使用的详细视图控制器实例。

performSegueWithIdentifier确实向prepareForSegue发送了一条消息。要解决我的问题,我必须做两件事。

创建一个从主视图控制器到详细视图控制器的第二序列。
原始定序从表格视图行链接到详细信息视图控制器。第二个主题我从主视图控制器链接到详细视图控制器。 (使用Interface Builder中视图控制器的页脚中的视图控制器图标。)

在if语句中,将对象创建行从insertNewObject移到prepareForSeque,该语句选择第二个序列的唯一名称。

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

    }
}

最佳答案

在您的insertNewObject:方法中,您有这两行-

self.detailViewController.detailItem = newManagedObject;
self.detailViewController.context = context;


...这表明您已经尝试初始化要使用的detailViewController。您不需要这样做,因为它已经在情节提要中链接了,所以它会自动初始化,并且您可以按照您实际的方式在prepareForSegue:sender:方法中将想要传递的任何信息传递给它。

至于获取正确的数据,也许您可​​以在tableView的委托方法tableView:didSelectRowAtIndexPath:中执行此操作,然后只需将ivar设置为所选行的行号,即可在prepareForSegue:方法中获取信息。

关于objective-c - 使用newManagedObject将insertNewObject分隔到detailViewController,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10155280/

10-12 04:32