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ステートメントで、オブジェクト作成行をからに移動します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];
}
}