0

DO STUFF のコードを作成するのは悪くないと思います。しかし、私は自分の変数と永続的なデータを保存するのが苦手です。私はARCとストーリーボードを使用しています(ストーリーボードはフードの下で私には見えないことをしているように見えるので、ストーリーボードを捨てることを考えています)。

私は助けを求めます。今まで見つけたソースから、自分がやりたいことを行う方法の概念を把握できませんでした。

私の考えは次のとおりです。ユーザーには、各行の文字列 (株価名) を表示する tableviewcontroller タイプの viewController が表示されます。文字列は永続的に保存する必要があり、コアデータにあると思います。アプリケーションは、ユーザーが 2 番目のビュー コントローラーに文字列を追加できるようにします。これらも最初のデータに沿って永続的に保存する必要があります。次に、アプリケーションは Web ベースのデータを取得し、文字列 (株価) と一緒に表示する必要があります。アプリが終了すると、Web ベースのデータが削除され、文字列 (株価名) だけが保持されます。

どちらかで助けを求めます。

アプリは警告を表示せず、問題なくコンパイルします。

次に、 NSLog(@"2");の直後にクラッシュします。以下のviewDidLoadコードで、* キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。

Appdelegate.h
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

Appdelegate.m
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

- (void)prvniSpusteni
{
    NSLog(@"Firt run of app, example Stocks added.");
    NSManagedObjectContext *context = [self managedObjectContext];

    // Creating, Apple, Google, Bekrshire B

    Stock *akcie1 = [NSEntityDescription insertNewObjectForEntityForName:@"Stock" inManagedObjectContext:context];
    akcie1.ticker = @"AAPL";
    akcie1.index = [NSNumber numberWithInt:0];
    Stock *akcie2 = [NSEntityDescription insertNewObjectForEntityForName:@"Stock" inManagedObjectContext:context];
    akcie2.ticker = @"HIMX";
    akcie2.index = [NSNumber numberWithInt:1];
    Stock *akcie3 = [NSEntityDescription insertNewObjectForEntityForName:@"Stock" inManagedObjectContext:context];
    akcie3.ticker = @"BRK-B";
    akcie3.index = [NSNumber numberWithInt:2];

    NSError *error;
    if (![context save:&error]) {
        NSLog(@"Error: %@", [error localizedDescription]);
    }
    [self aktualizaceDatTrhu]; // method to get data from web declared in Appdelegate aswell.
}

ViewController.h
@property (nonatomic, strong) NSManagedObjectContext* managedObjectContext;
@property (nonatomic, strong) NSArray *ulozeneAkcie;

ViewController.m
@interface ViewController ()
@end

@implementation ViewController
@synthesize managedObjectContext;
@synthesize ulozeneAkcie;

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSManagedObjectContext *context = managedObjectContext;
    **NSLog(@"2");**
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Stock" inManagedObjectContext:context];
    NSLog(@"3");
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSLog(@"4");
    [request setEntity:entityDescription];
    NSLog(@"5");
    // Nastav trideni do arraye
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                        initWithKey:@"index" ascending:YES];
    [request setSortDescriptors:@[sortDescriptor]];
    NSLog(@"6");
    NSError *error;
    ulozeneAkcie = [managedObjectContext executeFetchRequest:request error:&error];
    NSLog(@"7");
    }

問題は、viewcontroller が管理オブジェクト コンテキストへのアクセスに何らかの形で失敗することだと思います。しかし、コアデータはグローバルとして扱われ、レゴ ブロックの箱のようにアプリのどの部分からでもアクセスできると思いました。

ここまで読んでくれた人に心から感謝し、洞察を提供してくれた人にさらに深く感謝します。

誰かがそのように感じたら、これが実際に機能するように、どのプロパティをどこに配置するか、どのシンセサイズとフックをどこに配置するかの例を取得したいと思います。

PS:オンラインでいくつかの「類似の」質問を見つけ、それらはMOCをviewControllerに渡すことについて話しましたが、私のアプリはストーリーボードで作成されているため、多くのフックとアウトレットを見逃しており、それらを追加しても何も解決しません..

4

1 に答える 1

0

あなたの質問に基づいて、2つの異なることを確認する必要があります。

まず、コア データ スタックを正しくセットアップしましたか? 通常、Apple が行うように、これはアプリ デリゲートで設定できます。

次に、コンテキスト参照を正しく挿入しますか? これは、次のように実行できます。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"segueIdentifier"])
    {
        ViewController *vc = [segue destinationViewController];
        vc.managedObjectContext = mainContext; // pass here the context that you created in app delegate or you grabbed from another property, for example
    }
}

今、あなたのviewDidLoad

[super viewDidLoad];

if(!self.managedObjectContext) // see if context is nil
    NSAssert(NO, @"The context cannot be nil"); // just for test purposes

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Stock" inManagedObjectContext:context];
NSLog(@"3");
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSLog(@"4");
[request setEntity:entityDescription];
NSLog(@"5");
// Nastav trideni do arraye
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                    initWithKey:@"index" ascending:YES];
[request setSortDescriptors:@[sortDescriptor]];
NSLog(@"6");
NSError *error;
ulozeneAkcie = [managedObjectContext executeFetchRequest:request error:&error];
NSLog(@"7");
于 2013-03-24T14:44:47.373 に答える