クラス間で、自分のクラスのインスタンスを渡したいときのお話。
シングルトンで、自分のクラスのインスタンスを毎回「ViewDidLoad」で読み込まれた際に保存すしたい時に、自分のクラスのインスタンスってどうやって取得するんだ?
って事で詰まりました。
ちなみに以下がシングルトン。クラスメソッドを使用します。
(普通のシングルトンとは使い方が違うので、シングルトンという記述は正しくはないと思いますが・・・。)
---------------------------------------------
static id theSharedManager = nil;
+ (id)sharedManager{
if(theSharedManager == nil){
theSharedManager = [[self alloc] init];
}
return theSharedManager;
}
---------------------------------------------
で、ここにviewDidLoadされた際に、
theSharedManager = ”自分のクラスのインスタンス”
と入力する訳ですが、肝心の書き方が分からない。
色々試してみた所、まず自分のクラスのインスタンスを見るには
NSLog(@"%@", [self description]);
で確認できます。
で、以下の"presentingViewController"や"presentedViewController"ではNULLがコンソール上に表示され、使えなかったです。
//親クラスを表示
NSLog(@"%@", [self presentingViewController]);
//子クラスを表示
NSLog(@"%@", [self presentedViewController]);
この二つを使用する場合は、基本的にModalViewのサンプルが多かったので、私の勝手な解釈ですが、ModalViewやAddSubviewのパターンに使うのかな?と思いました。
じゃぁどうするの?って事で次のパターンを使います。
NSLog(@"%@", [self parentViewController]);
そうなんです。親を使います。
親は基本的に取得できるので、そこから子供である自分自身のインスタンスに飛ぶのです。
[[self parentViewController] childViewControllers]
複数形なので、この返り値は、子供のビューコントローラーの配列です。
そこから自分のインスタンスを指定すれば、大丈夫です。
私の場合は一つしかなかったので、
theSharedManager = [[[self parentViewController] childViewControllers] objectAtIndex:0];
で自分のクラスのインスタンスを格納する事ができました。
勉強になったなぁ。
以上です。
------------------------------------
追記
親や子がいない場合どうするのって事で調べました。
もっと簡単に自分のクラスのインスタンス得る事ができました。それもシンプルに。
theSharedManager = self;
そうだよね~。よく考えたらselfでいけるよね~。っていう話。
これからは親とか子とか使わずに単純にselfを使ってアクセスしてくださいね!
ちなみにデリゲートは
(~~AppDelegate*)[[UIApplication sharedApplication] delegate];
で簡単に得る事ができます。