渋谷で働くUnity野郎 -41ページ目

渋谷で働くUnity野郎

備忘録として有効活用していきます。

クラス間で、自分のクラスのインスタンスを渡したいときのお話。

シングルトンで、自分のクラスのインスタンスを毎回「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];
で簡単に得る事ができます。