1

私はこれに約2週間立ち往生しています。よく聞かれることを投稿するのは嫌いですが、実際にはすべて経験しました。

Ray Wenderlich のチュートリアルを使用して、iPhone アプリにデータを保存しました。

http://www.raywenderlich.com/tutorials

これが、アプリで行っているセットアップです。私は非常に単純なオブジェクトを保存しています。My Card オブジェクトは、名前、タイプ、および画像で構成されます。それで全部です。したがって、チュートリアルは私のものに非常に近いです。これは、これをよりイライラさせています。

問題は、読み込み用の NSLog ステートメントがいくつかあるということです。ロードに使用しているフォルダーと、ロードするオブジェクトを表示しています。現在、これを表示しています。

Loading cards from /Users/zach/Library/Application Support/iPhone Simulator/7.0.3-64/Applications/E3DB01FD-A37E-4A69-840B-43830F2BDE2C/Library/Private Documents
2013-11-04 00:02:50.073 CardMinder[84170:a0b] ()

そのため、それらをロードしようとしているようですが、ロードするものがありません。ここにデータを保存するための私の関数があります。

- (void)saveData {
    if (_data == nil) return;

    [self createDataPath];

    NSString *dataPath = [_docPath stringByAppendingPathComponent:kDataFile];
    NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:_data forKey:kDataKey];
    [archiver finishEncoding];

    NSLog(@"%@",dataPath);
    NSLog(@"%@",data);

    [data writeToFile:dataPath atomically:YES];

}

これは、実際にそのチュートリアルに掲載されているものです。あなたが私を助けてくれるほど寛大だと感じたら、もっとコードを投稿する必要があることはわかっていますが、役に立たないもので投稿をあふれさせたくないので、私に知らせてください.

私は最近絶望的な状態に入り、助けが必要です。

ありがとう

アップデート

    NSError *error;
    [data writeToFile:dataPath options:NSDataWritingAtomic error:&error];
    NSLog(@"error: %@", error.localizedFailureReason);

これらは CardData クラスのメソッドです。私はここで名前、型、およびブールを行っています。

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:_name forKey:kNameKey];
    [aCoder encodeObject:_cardType forKey:kTypeKey];
    [aCoder encodeBool:_checkedOut forKey:kOutKey];

}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    NSString *name = [aDecoder decodeObjectForKey:kNameKey];
    NSString *cardType = [aDecoder decodeObjectForKey:kTypeKey];
    BOOL checkedOut = [aDecoder decodeBoolForKey:kOutKey];
    return [self initWithName:name cardType:cardType _Bool:checkedOut];
}

更新 2

さらに NSLog ステートメントを追加したところ、アプリで [カードを保存] ボタンを押しても、saveData 関数がまったく実行されていないように見えることがわかりました。その saveData 関数には大量のログ ステートメントがあり、saveCard ボタンをクリックしても、それらのログは表示されません。なぜそれが起こっているのでしょうか?

これは私の saveButton コードです。

- (IBAction)saveNewCard:(id)sender
{
    NSString *cardName = self.nameField.text;

    _cardDoc.data.name = cardName;


    CardDoc *newCard = [[CardDoc alloc] initWithName:cardName cardType:cardTypeString _Bool:NO image:chosenIcon];

    [_cardDoc saveData];
    NSLog(@"Card save button pressed!");

    CardViewController *cardViewController = (CardViewController *)[self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count-2];

    [cardViewController.cards addObject:newCard];
    [self.navigationController popToRootViewControllerAnimated:YES];


}
4

2 に答える 2

0

いくつかのこと。

ログステートメントの結果を投稿して、何が表示されているかを確認してください。

アプローチが機能するためには、_data オブジェクトが NSCoding プロトコルに準拠している必要があります。つまり、インターフェースにプロトコル宣言を追加し、encodeWithCoder および initWithCoder メソッドを実装する必要があります。

これらのメソッドでは、オブジェクトのすべての状態データを保存し、状態をオブジェクトにロードする必要があります。

これらのメソッドは、コードの問題の原因となる可能性が最も高いものです。ヘルプが必要な場合は、これらのメソッドを投稿し、デバッガーでそれらをウォークスルーします。

NSKeyedArchvier クラスのメソッド archivedDataWithRootObject も参照してください。このメソッドは、オブジェクトを受け取り、それを NSData オブジェクトに 1 ステップでエンコードします。メソッド archiveRootObject:toFile: はさらに一歩進んで、データを直接ファイルに書き込みます。

NSKeyedUnarchiver には、対応するメソッド unarchiveObjectWithData および unarchiveObjectWithFile があり、データ/ファイルからオブジェクトを再作成します。

于 2013-11-06T02:01:03.417 に答える
0

;writeToFile:options:error:の代わりに使用する必要があります。writeToFile:atomically:エラーメッセージが表示されるので、役立つはずです。( に相当するatomically:YESのは option 定数です。) ;NSDataWritingAtomicの戻り値が返されることを確認してください。YESそうでない場合は、エラーを設定する必要があります。

の値を取得しているNOが、エラーが設定されていない場合は、メッセージを送信していることを意味しますnil。Objective-C の特徴は、メッセージングnilが完全に有効であることです。メソッドが何かを返すように定義されている場合、結果も得られます:0または同等のもの ( NOnilなど)。

この場合、メッセージを送信しています_cardDoc。検出する戻り結果はありません。これは防御的なコーディングが少し難しくなりますが、[_cardDoc saveData]実際には[nil saveData]. デバッガーは、行を通り過ぎるだけです。

一般に、絶対にすべきではないものがあるnil場合は、次を使用できますNSAssert

NSAssert(_cardData, @"_cardData should not be nil");
[_cardData saveData];

ただし、これは慎重に使用してください。おそらく、通常はこの動作を高く評価するようになるでしょう。

于 2013-11-06T23:54:50.350 に答える