3

まず、これがこのサイトでの最初の投稿であることをお伝えしておきます。私はiOSのプログラミングを独学しようとしていますが、Googleで答えを検索すると、常にここに誘導されていることがわかります。ここに貢献してくれたすべての人に感謝します。あなたはすでに私をたくさん助けてくれました。

私はスタンフォードCS193Pクラスを経験しており、それが大好きです. しかし、私は今立ち往生しており、どこを向くべきかわかりません。

私の問題は UIManagedDocument にありました。

新しいスキルをテストするための簡単なアプリを作るのに疲れました。これはそれが何をするかです:

募金イベントへの個人の貢献を追跡するシンプルな会計アプリ。

各タブで次のことができる UITabBar があります。2. イベントの管理 (イベント) - イベントを追加、編集、または削除して参加者を追加し、そのイベントに参加者が持ち込んだもの (銀行) を追加できます。3. 設定。- すべてのデータを消去するリセット ボタンや「ダミー データ」ボタンなど、現在の状況を理解するのに役立ついくつかのボタンを追加しました。

3 つの coreData エンティティがあります。Players、Events、および Bank は、それぞれ他の 2 つとの関係があります。

このアプリを最初に作成しようとしたとき (iOS5 より前)、appDelegate を使用して ManagedObjectContext を作成し、viewControllers に渡しました。それはうまくいきました。しかし今、私は UIManagedObjectDocument を使用し、AppDelegate を使用しないことになっています。原則とiCloudへの統合を理解していると思います。(私は間違っているかもしれません)

クラスの例とオンラインで見つけたものを使用して、UINavigationControllers 内の各 ViewControllers の最初のものを ManagedDocument に提供するヘルパー クラスを作成しました。

+ (UIManagedDocument *)sharedManagedDocument
{
    static UIManagedDocument *sharedDocument = nil;

    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    url = [url URLByAppendingPathComponent:@"DefaultAppDatabase"];
    // url is "<Documents Directory>/<DefaultAppDatabase>"

    // Create the shared instance lazily upon the first request.
    if (sharedDocument == nil) {
        sharedDocument = [[UIManagedDocument alloc] initWithFileURL:url];
    }

    if (sharedDocument.fileURL != url) {
        UIManagedDocument *newDocument = [[UIManagedDocument alloc] initWithFileURL:url];
        sharedDocument = newDocument;
    }

    NSLog(@"SharedDocument: %@", sharedDocument);

    return sharedDocument;
}

次に、最初の ViewController でドキュメントを開いてフェッチを実行しました。

そこから、選択した NSManagedObject をセグエ経由で次の ViewController に渡します。

問題は、データを追加またはリセットするときです。(「ダミーデータ」ボタンで動作させることができれば、個々のエントリで動作させることができると想定しています)「リセット」または「ダミー」ボタンを押すと、ログはそれがあったことを教えてくれますプッシュしましたが、アプリを再起動するまでデータに変化は見られません。すると見事に映ります。私の推測では、ファイルを正しく保存していないか、tableViews を正しく更新していません。私は NSNotification の使用を少し試みましたが、何にも応答することができなかったので、そこまでは行きませんでした。必要に応じて、喜んでその道を戻ります。

これは私の保存方法です...ほとんどデフォルトのcoreData appDelegateからコピーしただけです。

- (void)saveContext
{
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.appDatabase.managedObjectContext;
    if (managedObjectContext != nil)
    {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
        {
            /*
             Replace this implementation with code to handle the error appropriately.

             abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
             */
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        } 
    }

    [self.appDatabase saveToURL:self.appDatabase.fileURL
               forSaveOperation:UIDocumentSaveForOverwriting
              completionHandler:^(BOOL success){
                  if(!success) NSLog(@"failed to save document %@", self.appDatabase.localizedName);
                  if(success) NSLog(@"Success: save document %@", self.appDatabase.localizedName);
              }];

}

CS193P のインストラクターである Paul は、割り当て 6 で、ヘルパー メソッドを使用してブロックを介して UIManagedDocument を渡すことを提案しました。私はブロックの背後にある理論を理解していますが、ブロックについて完全に理解しているわけではないので、私の答えがそこにある可能性も否定していません。

助けてくれたり、より多くの研究を行うために正しい方向に私を向けてくれてありがとう. 申し訳ありませんが、この投稿は非常に長くなりました。できるだけ明確にしようとしていました。

4

1 に答える 1

2

私はすべてを考えすぎていました。アランはこの投稿で私の質問を完璧にしました:

ブロックを使用してアプリケーション全体で共有されるディスク上のドキュメントごとにグローバル UIManagedDocument インスタンスを作成するにはどうすればよいですか?

質問と回答ですべてが解決しました。

ありがとう

于 2012-02-13T01:04:54.900 に答える