前回、クラス間のデータ受け渡しの方法として、クラスに外部からデータの読み書きができる変数を作成して受け渡しを実現しましたが、今回はAppDelegateを使ってデータの受け渡しをしてみたいと思います。
こちらの方が変数が一箇所にまとまって読みやすいですが、あまりオブジェクト指向的ではないような気もします。
サクッと行きたい場合はこちらを使うのもいいと思います。
前回、セグエを使った繋ぎ方もまとめましたので、今回は割愛したいと思います。
必要な場合は、こちらでご確認ください。
AppDelegateを使った変数の受け渡し方法は以下の手順になります。
超簡単です。
ただ、グローバル変数的にデータを扱うことになるので、忌避する人はしますね。
事前の準備として、SecondViewControllerクラスをUIViewControllerのサブクラスとして作成しておきます。
また、ストーリーボードでSecondViewControllerをカスタムクラスとしたViewControllerを追加しておきます。
ここでは文字列を扱うNSString型の変数を作ってみます。
変数の宣言は以上です。
これはAppDelegate.mのapplicationというメソッドで行います。
初期化は以上です。
@implementation AppDelegateの後ろに@synthesize hogeを追加しないとエラーが出る(こともある。AppDelegate.hでどうhogeを宣言したかによる)ので注意してください。
ここでは、ViewControllerでNSLogで表示するために、viewWillAppearメソッド内で使ってみます。
続いて、SecondViewControllerでテキストフィールドを作り、そこでhogeを書き換えできるようにします。
SecondViewController.mでは、読み込み完了時にAppDelegateからhogeを読み取ってテキストフィールドで値を表示します。
また、テキストフィールドで入力が終わってからリターンキーを押した時に仮想キーボードも閉じるように別途設定しました。ついでにキーボードが閉じた時、テキストフォールドの文字列をhogeに戻しています。
以下、SecondViewController.mの中身です。
1では、キーボードのリターンキーが押された時に動作するcloseKeyboardメソッドを宣言しています。
「Did End On Exit」イベントにcloseKeyboardメソッドをアタッチするためです。
2では画面遷移時にAppDelegateのhogeから文字列を取得し、テキストフィールドに代入する処理を書いています。
3ではリターンキーを押して入力を確定させた時にAppDelegateのhogeを書き換えています。
スマートフォンアプリは元の画面に戻る前にバックグラウンドへ追いやられてアプリが再起動するというシチュエーションも考えられるので、確定したら即反映させています。が、このプログラムではアプリが再起動した時点でhogeの初期化が行われるので関係ありません。:-)
という感じです。
2画面程度で、変数の数が大した量でない場合はクラス間でデータをやり取りするよりコードがすっきりしますし、コード量も少なくて済みます。
こちらの方が変数が一箇所にまとまって読みやすいですが、あまりオブジェクト指向的ではないような気もします。
サクッと行きたい場合はこちらを使うのもいいと思います。
前回、セグエを使った繋ぎ方もまとめましたので、今回は割愛したいと思います。
必要な場合は、こちらでご確認ください。
AppDelegateを使った変数の受け渡し方法は以下の手順になります。
- AppDelegate.hに変数を作成
- AppDelegate.mで変数を初期化
- AppDelegateを使って変数を利用するクラスファイルにAppDelegate.hをインポート
- AppDelegateをローカル変数に読み込んで利用
超簡単です。
ただ、グローバル変数的にデータを扱うことになるので、忌避する人はしますね。
事前の準備として、SecondViewControllerクラスをUIViewControllerのサブクラスとして作成しておきます。
また、ストーリーボードでSecondViewControllerをカスタムクラスとしたViewControllerを追加しておきます。
AppDelegate.hに変数を作成
まずはAppDelegate.hに必要な変数を追加します。ここでは文字列を扱うNSString型の変数を作ってみます。
@interface AppDelegate : UIResponder <UIApplicationDelegate>{ NSString *hoge; } @property (strong, nonatmic) UIWindow *window; @property (nonatmic) NSString *hoge; @end
変数の宣言は以上です。
AppDelegate.mで変数を初期化
次に宣言した変数を起動時に初期化します。これはAppDelegate.mのapplicationというメソッドで行います。
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { hoge = @""; return YES; }
初期化は以上です。
@implementation AppDelegateの後ろに@synthesize hogeを追加しないとエラーが出る(こともある。AppDelegate.hでどうhogeを宣言したかによる)ので注意してください。
AppDelegateを使って変数を利用するクラスファイルにAppDelegate.hをインポート
AppDelegateを使って変数の受け渡しをしたいクラスの.mファイルの先頭でAppDelegate.hをインポートします。#import "ViewController.h" #import "AppDelegate.h" // ←追加
AppDelegateをローカル変数に読み込んで利用
下準備は終わったので、AppDelegateをローカル変数に読み込んで読み書きしてみます。ここでは、ViewControllerでNSLogで表示するために、viewWillAppearメソッド内で使ってみます。
- (void)viewWillAppear:(BOOL)animated{ AppDelegate *ad = (AppDelegate *)[[UIApplication sharedApplication] delegate]; NSLog(@"[%@]", ad.hoge); }
続いて、SecondViewControllerでテキストフィールドを作り、そこでhogeを書き換えできるようにします。
SecondViewController.mでは、読み込み完了時にAppDelegateからhogeを読み取ってテキストフィールドで値を表示します。
また、テキストフィールドで入力が終わってからリターンキーを押した時に仮想キーボードも閉じるように別途設定しました。ついでにキーボードが閉じた時、テキストフォールドの文字列をhogeに戻しています。
以下、SecondViewController.mの中身です。
#import "SecondViewController.h" #import "AppDelegate.h" // ←追加 @interface SecondViewController () @property (strong, nonatomic) IBOutlet UITextField *str1; - (IBAction)closeKeyboard:(UITextField *)sender; // --1 @end @implementation SecondViewController -(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self){ } return self; } -(void)viewDidLoad // --2 { [super viewDidLoad]; AppDelegate *ad = (AppDelegate *)[[UIApplication sharedApplication] delegate]; self.str1.text = ad.hoge; } -(void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } -(IBAction)closeKeyboard:(UITextField *)sender { // --3 AppDelegate *ad = (AppDelegate *)[[UIApplication sharedApplication] delegate]; ad.hoge = self.str1.text; } @end
1では、キーボードのリターンキーが押された時に動作するcloseKeyboardメソッドを宣言しています。
「Did End On Exit」イベントにcloseKeyboardメソッドをアタッチするためです。
2では画面遷移時にAppDelegateのhogeから文字列を取得し、テキストフィールドに代入する処理を書いています。
3ではリターンキーを押して入力を確定させた時にAppDelegateのhogeを書き換えています。
スマートフォンアプリは元の画面に戻る前にバックグラウンドへ追いやられてアプリが再起動するというシチュエーションも考えられるので、確定したら即反映させています。が、このプログラムではアプリが再起動した時点でhogeの初期化が行われるので関係ありません。:-)
という感じです。
2画面程度で、変数の数が大した量でない場合はクラス間でデータをやり取りするよりコードがすっきりしますし、コード量も少なくて済みます。
コメント
コメントを投稿