

XcodeでObjective-Cで開発してます。  
ボタンを押すと数字が増えるという簡単なアプリを作っているのですが、アプリを消すと、数字のカウントが初期値に戻ってしまいます。  
これを、アプリを落としても継続されるようにするにはどうしたらいいでしょうか？

ソースコードを下記に記載しておきます。

**CounterViewController.h**

[code]

    IBOutlet UILabel *display; 
    int count; // 変数の宣言 
    
    - (IBAction)add;
    
[/code]

**CounterViewController.m**

[code]

    - (IBAction)add { count = count + 1; display.text = [NSString stringWithFormat:@"%d", count]; }
    
[/code]


CC BY-SA 3.0
2016-06-12T13:47:36.790
26691
2016-11-11T03:59:35.850
2016-06-13T16:37:43.430
5519
16824
question
ios objective-c xcode
アプリをホームボタン二回押しで終了しても、処理が継続されるようにしたいです。


さて、あなたのコード例のようにカウント値をインスタンス変数として保持するのであれば、基本は:

  * アプリが終了する前にそのインスタンス変数の値を保存する
  * アプリが起動する時に、保存された値があれば、それをインスタンス変数にセットする

と言った処理を追加することになります。  
(現在のiOSのViewControllerには、状態の保存／復元を行う便利な機能があるのですが、「ホームボタンを二回押しで終了」した場合には働きません。「ユーザが意図的にアプリを強制終了した場合は、次回は初期状態から起動するべき」と言うのがAppleの考え方なのでしょう。本格的なアプリ作成に進まれるのなら、考慮した方が良いかもしれません。)

あなたのコードの場合、カウント値はViewControllerのインスタンス変数になっているので、「アプリが終了する前」は`viewWillDisappear:`、「アプリが起動する時」は`viewWillAppear:`で捉えるのが簡単でしょう。

CountViewController.mにそれら2つのメソッドを追加してください。

[code]

    #define MyViewControllerCount @"MyViewControllerCount"
    
    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
    
        //ViewControllerが表示される前に、保存された値があるかどうかをチェックする
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        if( [defaults objectForKey:MyViewControllerCount] ) {
            count = (int)[defaults integerForKey:MyViewControllerCount];
        } else {
            count = 0;
        }
        display.text = [NSString stringWithFormat:@"%d", count];
    }
    
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
    
        //ViewControllerが消える前に値を保存する
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setInteger:(NSInteger)count forKey:MyViewControllerCount];
    }
    
[/code]

なお、ここでは保存する値が整数値1件だけでしたので`NSUserDefaults`を使いましたが、アプリで状態保存を行う場合、別に「必ず`NSUserDefaults`を使う」と決まっているわけではありません。アプリが発展してデータ構造やデータ量が増えた場合には、Core
Dataや独自アーカイブなども検討した方が良いでしょう。

* * *

コメントでいただいた`UIButton`の`hidden`属性も保存したいという件ですが、コメント中に書いたように「Vi‌​ewControllerの状態保存／復元は`viewWillDisappear:`と`viewWillAppear:`が使える」と言う点は変わりません。上に示したコードにちょっと付け足して、例えばこのようにすれば、`hidden`状態も保存できると思いますが、いかがですか？

[code]

    #define MyViewControllerCount @"MyViewControllerCount"
    #define MyViewControllerButtonHidden @"MyViewControllerButtonHidden"
    
    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
    
        //ViewControllerが表示される時に、保存された値があるかどうかをチェックする
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        if( [defaults objectForKey:MyViewControllerCount] ) {
            count = (int)[defaults integerForKey:MyViewControllerCount];
            //MyViewControllerCountのデータがあれば、MyViewControllerButtonHiddenもあるはずなんでチェックは省略
            //_countButton.hiddenを復元
            _countButton.hidden = [defaults boolForKey:MyViewControllerButtonHidden];
        } else {
            count = 0;
        }
        display.text = [NSString stringWithFormat:@"%d", count];
    }
    
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
    
        //ViewControllerが隠されてしまう時に値を保存する
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setInteger:(NSInteger)count forKey:MyViewControllerCount];
        //_countButton.hiddenを保存
        [defaults setBool:_countButton.hidden forKey:MyViewControllerButtonHidden];
    }
    
[/code]

アプリを実用的なものに近づけていくと、どんどん保存すべき状態が増えていくことと思います。`NSUserDefaults`は、あくまでも数十件以下の単純な数値や短い文字列を保存する場所と割り切って、アプリが大規模になって来た時には発想を変えられるようにしておいてください。


CC BY-SA 3.0
2016-06-13T15:53:57.650
26718
2016-06-14T10:35:56.397
2016-06-14T10:35:56.397
13972
13972
26691
answer