まず、このサイトの最初の投稿です。私はiOSをプログラムするために自分自身を教えようとしています。私の答えはGoogle検索で、私は常にここに向けられています。ここに貢献したすべての人に感謝します。あなたはすでに私を助けてくれました。UIManagedDocumentをどのように扱いますか?
私はスタンフォードCS193Pクラスを使い、それを愛しています。しかし、私は今すぐに立ち往生し、どこを向けるべきかわからない。
私の問題はUIManagedDocumentにあります。
私は新しいスキルをテストするためにシンプルなアプリを作るのに疲れました。これは以下のとおりです。
募金イベントへの個人の寄付を追跡するシンプルな会計アプリケーションです。
私はUITabBarを持っており、各タブで次のことができます。 1.参加者(プレーヤー)を追跡する - これはアドレス帳に接続し、追加するか、このアプリケーションに保持します。 2.イベントの管理(イベント) - イベントを追加、編集、削除して参加者を追加し、そのイベントに参加したもの(銀行)を追加することができます。 3.設定。 - すべてのデータを消去するリセットボタンと「ダミーデータ」ボタンを含めて、今すぐに問題を解決するためのボタンを追加しました。
私は3つのcoreDataエンティティを持っています。プレイヤー、イベント、銀行はそれぞれ他の2人と関係を持っています。
私はこのアプリケーション(pre iOS5)を作成しようとしましたが、私はappDelegateを使って自分のManagedObjectContextを作成し、それを私のviewControllerに渡しました。それはうまくいった。しかし、今私はUIManagedObjectDocumentを使用し、AppDelegateは使用しないことになっています。 iCloudの原則と統合について理解していると思います。
クラスの例とオンラインで見つかったものを使用して、UINavigationControllersのManagedDocument内にある各ViewControllerの最初のものを提供するヘルパークラスを作成しました。
+ (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にsegueを通じて渡されます。
問題は、データを追加またはリセットするときです。 (私はそれが "ダミーのデータ"ボタンで動作するようにすることができればそれを個々のエントリで動作させることができると仮定しています) "Reset"または "Dummy"ボタンを押すと、プッシュされましたが、アプリを再起動するまでデータが変更されることはありません。その後、それは完全に現れます。私の推測では、ファイルを正しく保存していないか、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から講師は、ブロックを通してUIManagedDocument周りを通過するヘルパーメソッドを使用するために割り当て6で提案。私はブロックの裏に理論を持っていますが、私の答えがそこにもあるかもしれないということを除外していないので、ブロックを完全に包囲していません。
もっと多くの研究をするための助けや正しい方向への私の指導に感謝します。申し訳ありませんが、この投稿は長すぎるので、私はできる限り明確にしようとしていました。