Exception Code.

iPhone、Macと読書が大好き。iPhone・Mac・書評を中心に好きな事を書いていました。今は『ほーくブログ』でブログを書いています。

[XCode]親子関係じゃないView間で値の受け渡しをする方法

      2013/09/06

ごにょごにょXCodeをいじっているんですが、親子関係じゃないView間での値の受け渡しをどうやるかが全くもってわからない状況に陥っていました。

Google先生に聞いてみても、それっぽいことは書いてあるのですが、スッキリした答えがなかなか見つからない。

悩みに悩んだ末、「分かる人に聞く」という方法で解決したのでシェア。XCodeは4.4を使います。

値の受け渡し

iOSプログラミングでは、値の受け渡し方法が作り方によって結構異なります。

親子関係のView間で値を受け渡す方法については、以下の記事が非常にわかりやすいです。お世話になりました。

ビュー間、クラス間での値の受け渡し|成長の果実

そして、StoryBoardからの値受け渡しも、非常にわかりやすく解説された記事があります。感謝感謝です。

絶対に挫折しないiPhoneアプリ開発入門Part.20 ~StoryboardのSegueを使って異なるView間での値の受け渡し~ – 三千世界のインターネットで烏と共に

んで、どうしてもわからなかったのが、親子関係じゃないビュー間での値の受け渡し&ビューをStoryBoardで作ってないクラスの値を受け渡す場合。

結論から言えば、AppDelegateでプロパティを作って参照すればOKのようです。

イメージで言えばこんな感じ。

NewImage

AppDelegateを使えば、基本的に自由自在にできるというイメージですね。

例で確かめてみる

今回はViewのないクラス「CallClass」(呼び出し元)に作ったメソッドを使って、StoryBoardに作ったView「ViewController」(呼び出し先)にメッセージを入れてみます。

以下のようにStoryBoardでViewを作ります。「Label」と書かれた文字を「メッセージ」に変更してみます。

DataControlTest xcodeproj  CallClass m

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]が[メッセージ]に変わります。

IOSシミュレータ

これで値が扱えるようになりました。結構開発の幅が広がりそう。

最後に

AppDelegateをいちいち宣言するのがめんどくさい場合は、以下の方法を使うと異常にスムーズに開発できます。感謝。

AppDelegate をちょくちょく呼び出すためにすること | 極上の人生

 - 開発/プログラム

  関連記事

bloggerXcode-icon-375x375-75.png
[XCode]NSNotificationってなに?って人もとりあえずこれだけは知っておくべき

異なるクラス間で通知や変数を渡したりできる便利なNSNotificationです …

bloggerXcode-icon-375x375-75.png
[XCode]スキャナーで読み取れるバーコード(JANコード・Code39)をフォントで表示する方法と注意点

Passbookなどもそうですが、最近はクーポンや会員証などの電子化をよく目にし …

[XCode]iPhoneに入っていないフォント(カスタムフォント)を使えるようにする方法と注意点

iPhoneは結構いろんなフォントが使えますが、「オリジナルのフォントを使いたい …

bloggerXcode-icon-375x375-75.png
[XCode]StoryBoardで作ったTableViewCellでオリジナルのセルを表示する方法

TableView標準のセルではやりたいことが表現できなさそうな時には、Tabl …

信じられないほど簡単にオブジェクト指向って何?を解決してくれる本

「俺がやらなきゃ誰かやる」が合言葉の社会に生きている僕です。分からないことを分か …

bloggerXcode-icon-375x375-75.png
[XCode]UINavigationBarにUIBarButtonItemでボタンを追加する方法

アプリ開発には欠かせないナビゲーションバー。 UINavigationBarにボ …

bloggerXcode-icon-375x375-75.png
[XCode]ARC使用中にエラー「EXC_BAD_ACCESS」「respondsToSelector」が出た場合の対処法

なんでも、このエラーは解放済み(ゾンビ)のインスタンスにアクセスした時に出るエラ …

bloggerXcode-icon-375x375-75.png
[XCode]Title set but using a system Identifierなる警告が出たときの対処法

最近iPhoneアプリ開発を始めた@hawk_aです。 StoryBoardを使 …

bloggerXcode-icon-375x375-75.png
[XCode]追加してインポートしたヘッダーファイルが見つからないときの対処法3つ

XCodeでインポートの宣言をした際(import <hoge.h> …

bloggerXcode-icon-375x375-75.png
[XCode]gitでcommitしたファイル(リモートリポジトリ)を巻き戻す方法

結構前からgitを実験的に導入してcommitやpushをしています。とうとう先 …