[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]iPhoneに入っていないフォント(カスタムフォント)を使えるようにする方法と注意点
iPhoneは結構いろんなフォントが使えますが、「オリジナルのフォントを使いたい …
-
-
[XCode]StoryBoardで作ったTableViewCellでオリジナルのセルを表示する方法
TableView標準のセルではやりたいことが表現できなさそうな時には、Tabl …
-
-
[XCode]NSNotificationってなに?って人もとりあえずこれだけは知っておくべき
異なるクラス間で通知や変数を渡したりできる便利なNSNotificationです …
-
-
[XCode]ARC使用中にエラー「EXC_BAD_ACCESS」「respondsToSelector」が出た場合の対処法
なんでも、このエラーは解放済み(ゾンビ)のインスタンスにアクセスした時に出るエラ …
-
-
[XCode]UINavigationBarにUIBarButtonItemでボタンを追加する方法
アプリ開発には欠かせないナビゲーションバー。 UINavigationBarにボ …
-
-
[XCode 4.3]Text Fieldの入力が終わったら次のText Fieldにソフトウェアキーボードでカーソルを移動させて最後にボタンを押す方法
XCodeをしこしこやっております。ほーく(@hawk_a)です。 プログラムの …
-
-
デスマーチを止める!システム開発の成功に「設計」と「テスト」は欠かせない
「デスマーチ」という、IT業界で名の知れた用語があります。 商品知識のない営業が …
-
-
[git]Coda2でgitを設定してWordPressのテーマファイルをバックアップする方法
ブログのテーマを作り直していろいろしています。家ではiMac、外ではMacBoo …
-
-
[XCode]Title set but using a system Identifierなる警告が出たときの対処法
最近iPhoneアプリ開発を始めた@hawk_aです。 StoryBoardを使 …
-
-
[XCode]UIViewControllerからUISplitViewController 1つのビューからSplitViewに遷移させる方法
先日、アプリを初めてAppleに申請しました。@hawk_aです。 iOS開発の …