2

入門 iOS 開発コース (約 50) の最終プロジェクトの複数のビューで文字列と整数を共有しようとしていますが、これをどのように行うのか疑問に思っています... MVC パラダイムが最適であることはわかっていますが、私たちはそうしませんでした。非常に高度なもの、特にコアデータに到達できません。私は NSUserDefaults を使用することを考えていました。それが間違っていることはわかっていますが、このアプリは非常に高速である必要はありません。これが私にとって最も簡単な方法だと思います。私の質問は、使用する NSUserDefault オブジェクトをどこでどのように宣言するのでしょうか? クラスで使用したのは、1 つのビューだけでした。ロードされた最初のビューで宣言すると、他のビューでアクセスできることがわかりますが、最初のビューのヘッダーファイルを他のビューのそれぞれにインポートする必要がありますか、それともアクセスできますか?


アップデート


NSUserDefaultsそこで、すべての にプロパティを作成して、物事を簡単にしようと考えましたViewControllers。次に、値を取得するために、NSUserDefaults (プロパティViewControllersも持つ) に格納されているデータにアクセスする必要があるビューに、それぞれのヘッダーを実装しました。NSUserDefaultその画面に到達し、何も更新されないまで、アプリは素晴らしく動作します。私の間違いは、私が実装した方法のどこかにあると確信しています NSUserDefaultsしかし、私はそれを正しく行う方法がわかりません。クラスでそれらを調べたとき(実際には、「Sam's Teach Yourself iPhone Application Development in 24 Hrs」(吐く、それは私を怒らせます)の直接研究です)、それらを使用したのは単一のビューアプリケーションでのみでした。白い背景のアルファなので、フラッシュ ライトとして使用できます。これはそれが提示された方法です:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setInteger: var forKey: kVar];
[userDefaults synchronize];

これは私が自分のアプリで試みていたことです:

ViewController.h各ビューの私のファイルでは:

...

@interface AppetizerViewController : UIViewController{
    NSUserDefaults *userDefaults;

    ...
}

@property(assign)NSUserDefaults *userDefaults;

userDefaults次に、ボタンをクリックしたときに、その値を次の場所に保存したいと思いました。

-(IBAction)plusEgg:(id)sender{
    eggs++;
    eggString = [NSString stringWithFormat:@"%d",eggs];
    eggQty.text = eggString;
    eggOrderedQty.text = eggString;

    [userDefaults setInteger:eggs forKey:kEggQty];
    [userDefaults synchronize];
    [self updateAppSubtotal];
}

-(IBAction)minusEgg:(id)sender{
    eggs--;

    if(eggs < 0){
        eggs = 0;
    }

    eggString = [NSString stringWithFormat:@"%d",eggs];
    eggQty.text = eggString;
    eggOrderedQty.text = eggString;

    [userDefaults setInteger:eggs forKey:kEggQty];
    [userDefaults synchronize];
    [self updateAppSubtotal];
} 

次に、すべてのビューのヘッダー ファイルにすべての定数があるため、NSUserDefault Keysすべてのヘッダー ファイルをこのBillViewControllerように実装し、次のようにアクセスしようとしました。

-(void)populateLabels{
    pieFinalQty.text = [NSString stringWithFormat:@"%d",
        [userDefaults integerForKey:kPieQty]];
    hazFinalQty.text = [NSString stringWithFormat:@"%d",
        [userDefaults integerForKey:kHazQty]];
    briFinalQty.text = [NSString stringWithFormat:@"%d",
        [userDefaults integerForKey:kBriQty]];
choFinalQty.text = [NSString stringWithFormat:@"%d",
        [userDefaults integerForKey:kChoQty]];
iceFinalQty.text = [NSString stringWithFormat:@"%d",
        [userDefaults integerForKey:kIceQty]];
}


-(void)getSubtotal{
    NSString *preSubString;
    NSString *subString;

    subFloat = [userDefaults floatForKey:kAppSub]+[userDefaults floatForKey:kBevSub]+
        [userDefaults floatForKey:kDesSub]+
        [userDefaults floatForKey:kEntSub]+[userDefaults floatForKey:kSidSub];

    if(subFloat < 10){
        preSubString = [[NSString alloc]initWithFormat:@"%1.2f",subFloat];
    }else if(subFloat < 100 && subFloat >= 10){
        preSubString = [[NSString alloc]initWithFormat:@"%2.2f",subFloat];
    }else if(subFloat < 1000 && subFloat >= 100){
        preSubString = [[NSString alloc]initWithFormat:@"%3.2f",subFloat];
    }else{
        preSubString = [[NSString alloc]initWithFormat:@"%4.2f",subFloat];
    }
    subString = [[NSString alloc]initWithFormat:@"$%@",preSubString];
    billSubtotal.text = subString;

    [preSubString release];
    [subString release];
} 

皆さんが私に説明しようとしたことは明らかに私の頭の中で完全に理解できなかったことと、私の命名規則がちょっとおかしいことを申し訳ありませんが、私はこれにほとんど休憩を挟まずに約 15 時間続けて取り組んできました。ここミネソタでは午前 4 時頃です。これについてどうすればよいですか?実装方法を明示する必要があるかもしれないことも申し訳ありません。

4

3 に答える 3

7

良い点NSUserDefaultsは、どこでもインスタンス化する必要がないことです。アプリケーションのどこからでもアクセスできます。を呼び出し[NSUserDefaults standardUserDefaults]て、そのオブジェクトとの間で読み取りまたは書き込みを行うだけです。オブジェクトを呼び出しsynchronizeて、変更がディスクに保存されていることを確認します。次にstandardUserDefaultsオブジェクトを取得すると、更新された情報が含まれます。

編集:上記のコードに基づいて、次の変更を加えて、標準のユーザー デフォルト オブジェクトを利用できます。

  1. あなた@property (assign) NSUserDefaults userDefaults;とあなたのメンバー変数を取り除くNSUserDefaults userDefaults;
  2. ユーザーのデフォルトに対して何かを読み書きしたい場所ならどこでも、一時変数を作成します。 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

あなたがやろうとしていたように見える他の方法は@property、標準のユーザーデフォルトオブジェクトになるように設定するstandardUserDefaultsことです。かなり、これはおそらくあなたが行くべき方法です)。

このようにするには:

  1. のままにしますが、代わりにに@property設定します(オブジェクトはd であるため、自分で保持する必要があります)。(オプション)がこれを作成するので、行を削除できます。(retain)(assign)standardUserDefaultsautoreleaseNSUserDefaults userDefaults;@property
  2. ビュー コントローラを初期化するとき (または、viewDidLoadここで行っているように で)、userDefaults変数を標準のユーザー デフォルト オブジェクトに設定します。

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.userDefaults = [NSUserDefaults standardUserDefaults];
    }
    
  3. 初期化メソッドに対応するメソッドでユーザーデフォルト変数を解放します (メソッドdeallocinit場合、またはviewDidUnloadの場合viewDidLoad):

    - (void)viewDidUnload
    {
        self.userDefaults = nil;
    }
    
于 2011-12-14T00:40:35.807 に答える
2

「宣言」するものは何もありません。[NSUserDefaults standardUserDefaults]どこから言っても、ユーザーのデフォルトにアクセスしていると言うたびに。デフォルトのデフォルト (つまり、特定のキーの初期値) を設定する必要がある場合は、プログラムの非常に早い段階で、たとえばアプリのデリゲートapplicationDidFinishLaunchingで を呼び出して設定しregisterDefaultsます。

于 2011-12-14T00:38:44.070 に答える
2

大量に使用しNSUserDefaultsている場合は、キーにタイプミスがないように、自分でカテゴリを作成すると便利な場合があります。たとえば、常に値を取得して設定すると、間違ったキーを入力していないことを確認するためにコンパイラーにチェックを行わせると便利です。もちろん、オートコンプリートは大好きです。

// NSUserDefaults+PSProperties.h

@interface NSUserDefaults (PSProperties)

@property (nonatomic, assign) NSInteger ps_myInteger;

@end

// NSUserDefaults+PSProperties.m

NSString * const PSKeyMyInteger = @"PSKeyMyInteger";

@implementation NSUserDefaults (PSProperties)

- (NSInteger)ps_myInteger;
{
    return [self integerForKey:PSKeyMyInteger];
}

- (void)setPs_myInteger:(NSInteger)ps_myInteger;
{
    [self setInteger:ps_myInteger forKey:PSKeyMyInteger];
}

@end

その結果、ユーザーのデフォルトを使用する他のクラスでは、次のようなことができます。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

defaults.ps_myInteger = 5;
[defaults synchronize];

NSLog(@"%i", defaults.ps_myInteger);

> 2011-12-14 01:10:28.041 SampleUserDefaults[5356:f803] 5

これで、すべてのキーが非表示になりNSUserDefaults、アプリに関連するより優れた API を使用して操作できるようになりました。

于 2011-12-14T01:14:04.397 に答える