0

こんにちは、みなさん。私は、消費者が初めてモーダルを使用するときにモーダルを表示するアプリに取り組んでいます。[保存]ボタンを押すと、要求した情報を保存する.plistファイルがあります。.plistファイルから正常に読み取ることができ、saveメソッドを実行すると、SEEMSは正常に機能しますが、.plistファイルが更新されません。ここでの問題はよくわかりません。私はこのようなモーダルを示しています。

 - (void) getConsumerInfo {
 NSString *filePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"consumer.plist"];
 NSMutableDictionary *plistConsumerInfo = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];

 NSString *hasAppeared = [plistConsumerInfo objectForKey:@"HasAppeared"];

 if(hasAppeared != kHasAppeared) {
  ConsumerInfoViewController *tmpConsumerInfoVC = [[ConsumerInfoViewController alloc]
               initWithNibName:@"ConsumerInfoView" bundle:nil];
  self.consumerInfoViewController = tmpConsumerInfoVC;
  [self presentModalViewController:consumerInfoViewController animated:YES];
  [tmpConsumerInfoVC release];
 }
}

これは、アプリの起動時に最初のビューフォンのviewDidLoadメソッドによって呼び出されます。ConsumerInfoViewController内に、データが入力されたテキストフィールドがあり、[保存]ボタンが押されると、このメソッドが呼び出されます。

    - (IBAction)saveConsumerInfo:(id)sender {
 NSString *filePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"consumer.plist"];
 NSMutableDictionary *plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];

 NSString *tmpDiversName = txtDiversName.text;
 NSString *tmpLicenseType = txtLicenseType.text;
 NSString *tmpLicenseNum = txtLicenseNumber.text;
 NSString *tmpHasAppeared = @"1";
 NSString *tmpNumJumps = @"3";

 [plistDict setValue:[[NSString alloc] initWithFormat:@"%@", tmpDiversName] forKey:@"ConsumerName"];
 [plistDict setValue:[[NSString alloc] initWithFormat:@"%@", tmpLicenseType] forKey:@"LicenseType"];
 [plistDict setValue:[[NSString alloc] initWithFormat:@"%@", tmpLicenseNum] forKey:@"LicenseNumb"];
 [plistDict setValue:[[NSString alloc] initWithFormat:@"%@", tmpNumJumps] forKey:@"NumJumps"];
 [plistDict setValue:[[NSString alloc] initWithFormat:@"%d", tmpHasAppeared] forKey:@"Show"];
 [plistDict writeToFile:filePath atomically: YES];
 NSLog([[NSString alloc] initWithContentsOfFile:filePath]);
 [self dismissModalViewControllerAnimated:YES];
}

これはすべて問題なく正常に実行されますが、ファイルが更新されることはありません。アプリ全体でこの情報を使用できるように更新し、データが入力された後にビューが再び表示されないようにフラグを更新したいと思います。必要な情報が他にある場合はお知らせください。前もって感謝します!

4

3 に答える 3

2

バンドルディレクトリに書き込むことはできません。

代わりに、CachesフォルダーまたはDocumentsフォルダーを使用してください。NSSearchPathForDirectoriesInDomainsまたはNSHomeDirectory関数の戻り値を変更して、これらのフォルダーの場所(データを配置する場所)を見つける方法については、iPhoneのドキュメントを参照してください。

于 2009-12-18T19:13:38.840 に答える
0

これが誰かに役立つのであれば、これは私が似たようなことをするために使用するコードです。私はこれを使用して、最初の実行でいくつかのサンプルドキュメントをコピーします。または、必要に応じて、新しいバージョンが最後のバージョンよりも大きい場合は、オプションで(コメントセクション)コピーします。

BOOL firstrun()
{
    CFStringRef firstRunKey = CFSTR("lastVersion");

    CFNumberFormatterRef formatter;

    CFStringRef currentVersionString;
    CFMutableStringRef currentVersionMutableString;
    CFNumberRef currentVersion;

    CFStringRef lastVersionRunString;
//  CFMutableStringRef lastVersionRunMutableString;
//  CFNumberRef lastVersionRun;



    currentVersionString = CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), kCFBundleVersionKey);
    currentVersionMutableString = CFStringCreateMutableCopy(NULL, 0, currentVersionString);
    CFStringFindAndReplace(currentVersionMutableString, CFSTR("."), CFSTR(""), CFRangeMake(0, CFStringGetLength(currentVersionString)), 0);
    formatter = CFNumberFormatterCreate(NULL, NULL, kCFNumberFormatterNoStyle);
    currentVersion = CFNumberFormatterCreateNumberFromString(NULL, formatter, currentVersionMutableString, NULL, kCFNumberFormatterParseIntegersOnly);

    lastVersionRunString = CFPreferencesCopyAppValue(firstRunKey, kCFPreferencesCurrentApplication);

    if (lastVersionRunString == NULL)
    {
        // first run
        NSFileManager *f = [NSFileManager defaultManager];
        NSBundle *b = [NSBundle mainBundle];
        NSError *e;

        NSArray *xs = [NSArray arrayWithObjects: @"Welcome", 
                              @"A Child's Garden of Verses", 
                                     @"Address to a Haggis", 
                                               @"Sonnet 18", nil];

        for (id x in xs)
        {
            BOOL s = [f copyItemAtPath: [b pathForResource: x ofType: @"txt"] 
                   toPath: [DocumentManager pathForDocumentWithName: x]  
                    error: &e];

            if (s == YES)
            {
                NSLog(@"Copied first run file %@ successfully.", x);
            }
            else {
                NSLog(@"Failed to copy %@.", x);
            }
        }
    } // else {
        // The following is to enable support for new releases needing to show new information
/*
        lastVersionRunMutableString = CFStringCreateMutableCopy(NULL, 0, lastVersionRunString);
        CFStringFindAndReplace(lastVersionRunMutableString, 
                               CFSTR("."), 
                               CFSTR(""), 
                               CFRangeMake(0, CFStringGetLength(lastVersionRunMutableString)), 
                               0);
        lastVersionRun = CFNumberFormatterCreateNumberFromString(NULL, formatter, lastVersionRunMutableString, NULL, kCFNumberFormatterParseIntegersOnly);

        CFComparisonResult cr = CFNumberCompare(lastVersionRun, currentVersion, NULL);
*/      

//  }

    // Update last run version
    CFPreferencesSetAppValue(firstRunKey, currentVersionString, kCFPreferencesCurrentApplication);
    CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);

    CFRelease(currentVersionMutableString);
    CFRelease(formatter);
    CFRelease(currentVersion);

    return (lastVersionRunString == NULL);

    }
于 2010-04-10T05:21:42.620 に答える
0

これに追加するだけで、デバイス上でできなくても、シミュレーターでバンドルに書き込むことができます。これにより、シミュレーターとデバイスの間でデバッグに多くの時間を浪費することになりました。

于 2010-03-19T15:50:00.427 に答える