0

在 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 程序员。

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

performSegueWithIdentifier 确实prepareForSegue. 为了解决我的问题,我必须做两件事。

创建从主视图控制器到详细视图控制器的第二个 segue。原始序列从表视图行链接到详细视图控制器。我从主视图控制器链接到详细视图控制器的第二个 segue。(使用 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];

    }
}
4

2 回答 2

1

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

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

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

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

于 2012-04-14T17:17:57.230 回答
0

您正在将对象提供给目标视图控制器。您也不需要提供上下文......可以从对象本身获得(所有 NSManagedObjects 都有一个 managedObjectContext 属性)。

看起来您正在传递信息。我不知道你对所选部分的意思。

在被排序的视图控制器上,您需要确保抓取正在传入的数据...... viewDidLoad 是最常见的地方。

于 2012-04-14T16:45:36.673 回答