0

それぞれユーザーの入力を収集する 3 つのシーンがあります。各シーンには 5 つの UITextField があります。4 番目のシーンでは、UITableView に 15 個のテキスト フィールドがすべて表示されます。

これが最善の方法かどうかはわかりませんが、シーン 1 のコードは次のとおりです。

//Meetings is NSManagedObject class. Meetings.h and .m was created from the Meetings entity from Core Data
//I have this code once in the file right before I start saving the data
Meetings *meetings = (Meetings *) [NSEntityDescription insertNewObjectForEntityForName:@"Meetings" inManagedObjectContext:self.managedObjectContext];

// I have similar code below for each user's input.  
 NSString *date = [[NSString alloc] initWithFormat:@"%@", [dateFormatter stringFromDate:selectedDate]];
            DateLabel.text = date;
            [meetings setDateLabel:date];
            ...
            [meetings setTimeLabel:time];
            ..

//Code below is to save.  I have this once at the end of the file to save the data
NSError *error = nil;
if (![managedObjectContext save:&error]) {
    // Handle the error.
}
//The log below shows the saved data fine.  Thus, the data is being saved in managnedObjectContext.
NSLog (@"This is the DateLabel %@", meetings.DateLabel);

質問: シーン 2 および 3 からポインター *meetings にアクセスして、残りのフィールドを managedObjectContext に保存するにはどうすればよいですか? シーン 2 から NSLog を実行したところ、Null として表示されます。

//In Scene 2 viewDidLoad method I did the following to check: 

self.managedObjectContext = [(STAppDelegate *)[[UIApplication sharedApplication]  delegate] managedObjectContext];
Meetings *meetings = (Meetings *) [NSEntityDescription insertNewObjectForEntityForName:@"Meetings" inManagedObjectContext:self.managedObjectContext];
NSLog (@"This is the DateLabel from Scene 2 %@", meetings.DateLabel);

ログには次のように表示されます。

2013-02-11 18:04:05.447 MyApp[3505:c07] This is the DateLabel from Scene 2 (null)
4

2 に答える 2

0

前の画面から次の画面へのポインターをプロパティに格納して渡すか、オブジェクトのIDを渡して、必要に応じて最終画面にフェッチする必要があります。

以下はあなたのコードを反映していると仮定します。クラス名は同じではないかもしれませんが、必要に応じてフォローして変更できると思います。

シーン1ヘッダーファイル:

//
//  Scene1ViewController.h
// ... etc.

#import <UIKit/UIKit.h>
#import "Meetings.h"

@interface Scene1ViewController : UIViewController
@property (nonatomic, strong) Meetings *meetingsForScene1;
// ... etc.
@end

シーン2ヘッダーファイル:

//
//  Scene2ViewController.h
//  ... etc.

#import <UIKit/UIKit.h>
#import "Meetings.h"

@interface Scene2ViewController : UIViewController
@property (nonatomic, strong) Meetings *meetingsFromScene1;
@property (nonatomic, strong) Meetings *meetingsForScene2;
//  ... etc.
@end

meetingsForScene2要件に応じて、適切な場合と適切でない場合があります。Scene2からにデータを追加し、meetingsFromScene1そのインスタンスを次のシーンに渡すことができます。

シーン1の実装-prepareForSegue:sender:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController *destinationViewController = segue.destinationViewController;

    if ([segue.identifier isEqualToString:@"YourSegueIdentifierForTransistionFromScene1ToScene2"]) {
        Scene2ViewController *scene2 = [destinationViewController isKindOfClass:[Scene2ViewController class]] ? (Scene2ViewController *)destinationViewController : nil;

        NSAssert(scene2, @"scene2 should not be nil");
        NSAssert(self.meetingsForScene1, @"self.meetingsForSecen1 should not be nil");

        scene2.meetingsFromScene1 = self.meetingsForScene1;
    }
}

Scene2には2つのプロパティがある場合があることに注意してください。1つは現在のシーンのデータ用で、もう1つは前のシーンのデータ用です。重要なプロパティは、前のシーンのデータを保持するプロパティです。Scene1の-prepareForSegue:sender:メソッドは、Scene1のデータをScene2のプロパティに設定するのに適切なタイミングです。

NSAssertいくつかのチェックを行うためのいくつかの呼び出しを含めました。プロダクションコードからそれらを削除することを検討してください。また、を割り当てるときのチェックに注意してください*scene2。宛先コントローラーが適切な「種類」でない場合は、すぐにわかります。

私は必ずしもこのアプローチをあなたの問題の「最良の」ものとして主張しているわけではありませんが、このアプローチは、問題に完全に対処していなくても、少なくとも解決策への道を提供します。

于 2013-02-12T02:15:51.147 に答える
0

さて、viewDidLoadメソッドで行うことは、NSManagedObjectContextインスタンスに新しいオブジェクトを作成することです。

以前に作成したMeetingsオブジェクトに対してフェッチ要求を行う必要があります。

たぶん、CoreDataに関するチュートリアルを読む必要があります。以下は非常に理解しやすいです:http ://www.raywenderlich.com/934/core-data-on-ios-5-tutorial-getting-started

于 2013-02-12T02:17:06.120 に答える