[XCode]親子関係じゃないView間で値の受け渡しをする方法
2013/09/06
@hawk_a 親子じゃないときは、Appdelegateに変数書いてそれを参照すればいいよ。
— ラクイシさん (@rakuishi07) 8月 4, 2012
ごにょごにょXCodeをいじっているんですが、親子関係じゃないView間での値の受け渡しをどうやるかが全くもってわからない状況に陥っていました。
Google先生に聞いてみても、それっぽいことは書いてあるのですが、スッキリした答えがなかなか見つからない。
悩みに悩んだ末、「分かる人に聞く」という方法で解決したのでシェア。XCodeは4.4を使います。
値の受け渡し
iOSプログラミングでは、値の受け渡し方法が作り方によって結構異なります。
親子関係のView間で値を受け渡す方法については、以下の記事が非常にわかりやすいです。お世話になりました。
そして、StoryBoardからの値受け渡しも、非常にわかりやすく解説された記事があります。感謝感謝です。
絶対に挫折しないiPhoneアプリ開発入門Part.20 ~StoryboardのSegueを使って異なるView間での値の受け渡し~ – 三千世界のインターネットで烏と共に
んで、どうしてもわからなかったのが、親子関係じゃないビュー間での値の受け渡し&ビューをStoryBoardで作ってないクラスの値を受け渡す場合。
結論から言えば、AppDelegateでプロパティを作って参照すればOKのようです。
イメージで言えばこんな感じ。
AppDelegateを使えば、基本的に自由自在にできるというイメージですね。
例で確かめてみる
今回はViewのないクラス「CallClass」(呼び出し元)に作ったメソッドを使って、StoryBoardに作ったView「ViewController」(呼び出し先)にメッセージを入れてみます。
以下のようにStoryBoardでViewを作ります。「Label」と書かれた文字を「メッセージ」に変更してみます。
AppDelegate.h(デリゲート)
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; // ここに受け渡ししたい変数を宣言 @property (nonatomic,retain) NSString *strMessage; @end
ViewController.h(呼び出し先)
#import <UIKit/UIKit.h> @interface ViewController : UIViewController { IBOutlet UILabel *lblText; // 作成したViewの「Label」と繋げておく } @property(nonatomic,retain) NSString *strText; // 受け取りプロパティ @end
ViewController.m(呼び出し先)
#import "ViewController.h" #import "AppDelegate.h" // 追加 #import "CallClass.h" // 追加 @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; CallClass *cc = [[CallClass alloc] init]; // クラス呼び出し [cc CallMethod]; // メソッド呼び出し AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; // デリゲート呼び出し lblText.text = appDelegate.strMessage; // 代入 } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } else { return YES; } } @end
CallClass.h(呼び出し元)
#import <Foundation/Foundation.h> @interface CallClass : UIViewController - (void)CallMethod; @end
CallClass.m(呼び出し先)
#import "CallClass.h" #import "AppDelegate.h" // 追加 @implementation CallClass // これを呼び出してみる - (void)CallMethod { AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; // デリゲート呼び出し appDelegate.strMessage = @"メッセージ"; // デリゲートプロパティに値代入 } @end
※ちなみにXCode4.3以前の場合はpropertyだけじゃなく、mファイルにsynthesizeの宣言も必要です。
これで実行してみると、CallClassの[CallMethod]でデリゲートで宣言した変数strMessageの値に[メッセージ]が代入されて、ViewControllerの[Label]が[メッセージ]に変わります。
これで値が扱えるようになりました。結構開発の幅が広がりそう。
最後に
AppDelegateをいちいち宣言するのがめんどくさい場合は、以下の方法を使うと異常にスムーズに開発できます。感謝。
関連記事
-
[XCode]スキャナーで読み取れるバーコード(JANコード・Code39)をフォントで表示する方法と注意点
Passbookなどもそうですが、最近はクーポンや会員証などの電子化をよく目にし …
-
無料でプライベートリポジトリをゲットできるgitBREAKがかなり使える
gitといえばおおよそgithub。しかしgithubは無料でパブリックリポジト …
-
[git]Coda2でgitを設定してWordPressのテーマファイルをバックアップする方法
ブログのテーマを作り直していろいろしています。家ではiMac、外ではMacBoo …
-
信じられないほど簡単にオブジェクト指向って何?を解決してくれる本
「俺がやらなきゃ誰かやる」が合言葉の社会に生きている僕です。分からないことを分か …
-
[XCode]UIViewControllerからUISplitViewController 1つのビューからSplitViewに遷移させる方法
先日、アプリを初めてAppleに申請しました。@hawk_aです。 iOS開発の …
-
[XCode]UISplitViewControllerからUIViewController SplitViewから1つのビューに遷移させる方法
昨日に引き続き。 [XCode4.4]UIViewController→UISp …
-
プログラミングができるだけではプロジェクトは成功しない
プログラマーなのに最近は電話対応で1日が終わる僕です。いろんな所でうめき声ととも …
-
[XCode]NSNotificationってなに?って人もとりあえずこれだけは知っておくべき
異なるクラス間で通知や変数を渡したりできる便利なNSNotificationです …
-
[XCode]gitでcommitしたファイル(リモートリポジトリ)を巻き戻す方法
結構前からgitを実験的に導入してcommitやpushをしています。とうとう先 …
-
[XCode]追加してインポートしたヘッダーファイルが見つからないときの対処法3つ
XCodeでインポートの宣言をした際(import <hoge.h> …