スキップしてメイン コンテンツに移動

[iOS]初めてのiPhoneアプリ -コントローラ間のデータ受け渡し 其の二-

前回、クラス間のデータ受け渡しの方法として、クラスに外部からデータの読み書きができる変数を作成して受け渡しを実現しましたが、今回はAppDelegateを使ってデータの受け渡しをしてみたいと思います。
こちらの方が変数が一箇所にまとまって読みやすいですが、あまりオブジェクト指向的ではないような気もします。
サクッと行きたい場合はこちらを使うのもいいと思います。




前回、セグエを使った繋ぎ方もまとめましたので、今回は割愛したいと思います。
必要な場合は、こちらでご確認ください。


AppDelegateを使った変数の受け渡し方法は以下の手順になります。
  1. AppDelegate.hに変数を作成
  2. AppDelegate.mで変数を初期化
  3. AppDelegateを使って変数を利用するクラスファイルにAppDelegate.hをインポート
  4. 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画面程度で、変数の数が大した量でない場合はクラス間でデータをやり取りするよりコードがすっきりしますし、コード量も少なくて済みます。


コメント

このブログの人気の投稿

[VB.NET]オレオレ証明書でSSL通信するための短絡的な解決法

VB.NETソフトウェアでサーバーと通信することはよくある事だと思いますが、最近はHTTPを使って明けっ広げに刺しに行くよりHTTPSを使って暗号化してこそこそやった方が時代の流れに即した感じですよね(違うか)。 いちいちテスト環境でSSL証明書を用意するのも面倒だということで、セキュリティ的には全くよろしくない方法で迂回できるので紹介します。

[JS]Canvasでよく使う描画テクまとめ

HTMLで画像をいじくりたい時は、canvasを利用して編集するのは一般的ですが、WindowsストアアプリではHTML+CSS+JSでのアプリ開発ができる事もあって、簡単な画像編集であれば、C#やVBを使うより分かりやすいし資料が多く、C++でDirectXをガリガリ書くよりお手軽。入出力もファイルピッカーを使えば簡単に実装できます。今回は、Windowsのコードではなく、Canvasを利用する時のJavaScriptを使いどきに合わせてまとめていきます。

curl の基本的な使い方 -設定編-

今回のcurl TIPSは、curlをより日常的に使っていくためのHow toです。curlには、数多くのオプションが用意されていて、それらを組み合わせる事で様々な事が楽になるでしょう。サービス監視の自動化などにはまさにcurlの得意分野です。 今回は、curlを更に自分のものにしていくために大事なカスタマイズの部分を解説します。