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。私の問題を解決するために、私は2つのことをしなければなりませんでした。

マスタービューコントローラーから詳細ビューコントローラーへの2番目のセグエを作成します。元のシーケンスは、テーブルビューの行から詳細ビューのコントローラーにリンクされていました。マスタービューコントローラーからディテールビューコントローラーにリンクした2番目のセグエ。(InterfaceBuilderのViewControllerのフッターにあるViewControllerアイコンを使用します。)

2番目のシーケンスの一意の名前を選択するifステートメントで、オブジェクト作成行をからに移動しますinsertNewObjectprepareForSeque

- (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:メソッドには、次の2行があります-

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

...これは、セグエするdetailViewControllerをすでに初期化しようとしていることを示しています。これを行う必要はありません。ストーリーボードにリンクしているため、自動的に初期化され、prepareForSegue:sender:メソッドで必要な情報を渡します。実際の方法で行います。

適切なデータを取得することに関しては、tableViewのデリゲートメソッドtableView:didSelectRowAtIndexPath:でそれを実行し、選択した行の行番号にivarを設定するだけで、prepareForSegue:メソッドで情報を取得できます。

于 2012-04-14T17:17:57.230 に答える
0

オブジェクトを宛先のViewControllerに提供します。オブジェクト自体から取得できるコンテキストも指定する必要はありません(すべてのNSManagedObjectにはmanagedObjectContextプロパティがあります)。

情報を渡しているようです。選択したパーツの意味がわかりません。

後続のViewControllerでは、渡されるデータを確実に取得する必要があります...viewDidLoadが最も一般的な場所です。

于 2012-04-14T16:45:36.673 に答える