恥知らずのウェブエンジニア -web engineer, shameless

これは一歩を踏み出すことができない者たちのブログ

ios AppDelegateを使ってクラス間で変数を参照する

前回、JASidePanelsを使ってスワイプで画面切り替えを実装したので、
今回は実際にサイドメニューから
選択した内容によって画面が更新される的なやーつを実装してみました。
ios JASidePanelsでスワイプで画面切り替え - 恥知らずのウェブエンジニア

やりたいことは、
サイドメニューの項目(カテゴリ)を選択⇒メイン画面の表示内容が選択したカテゴリに絞込みされる
というもの。


が、ちょっぴりなかなか躓く。。。


最初は、サイドメニューの項目を選択すると、
メイン画面のプロパティを更新して、その後に描画し直すようにするよう試みる。

今後オブジェクトとか渡したいやら出てきたらどうしようと思いつつ、とりあえずやってみる。

やってみるもののうまくいかない。。。
そもそもカテゴリのsetter.getterをクラスメソッドにして実装するものの、
object-cにはクラス変数という概念がないそうで。。。
無理やりやるならC言語のstaticを使うしかないとのこと。


どうしましょ、、、と思っていたら、どうやらAppDelegateを使うといいとのこと。

そもそもAppDelegateとはアプリケーションの動作を引き受けるクラスだそう。
確かにメソッド見てみると起動時、バックグラウンドに回ったときのデリゲートが書かれている。

起動〜終了まで常に待ち構えてる的な感じですね。
なので、AppDelegateに変数を宣言して更新・参照すればよさそうです。


さっそく実装。
流れとしては、

  • AppDelegate.h、AppDelegate.mに変数、setter,getterメソッド記述。
  • サイドメニューを選択した時、AppDelegateのsetterメソッドを呼び、変数更新し、メイン画面に戻す。
  • メイン画面に戻ってきたら、AppDelegateのgetterメソッドを呼び、変数取得、画面描画。

実際のコード的には

・AppDelegate.h

@interface VPAppDelegate : UIResponder <UIApplicationDelegate>
{
    NSMutableDictionary *appDict; //なんとなく今後もいろいろ使えそうなのでDictionaryで宣言
}

@property (strong, nonatomic) NSMutableDictionary *appDict;
@property (strong, nonatomic) UIWindow *window;
- (void) setCategory:(NSString *)str;
- (NSString *) getCategory;


・AppDelegate.m
@implementation AppDelegate
@synthesize appDict = _appDict;

- (void) setCategory:(NSString *)str
{
    [self.appDict setValue:str forKey:@"category"];
}

- (NSString *) getCategory
{
    return [self.appDict objectForKey:@"category"];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.appDict = [[NSMutableDictionary alloc] init];
    [self.appDict setValue:@"" forKey:@"category"];

    return YES;
}


次にサイドメニュー選択時の処理に下記追加

    //デリゲート生成
    AppDelegate *appDelegete = [[UIApplication sharedApplication] delegate];
    [appDelegete setCategory:@"hogehoge!"];

    //JASidePanels 真ん中の画面に戻す
    self.sidePanelController.centerPanel = [self.storyboard instantiateViewControllerWithIdentifier:@"centerViewController"];

次に同じ要領で真ん中の画面でデリゲートから変数取得

    AppDelegate *appDelegete = [[UIApplication sharedApplication] delegate];
    NSLog(@"NOW CATEGORY : %@", [appDelegete getCategory]);


でできました。


共通のメソッドとかAppDelegateに記述すれば、各クラスで呼べて便利そうですが、
使い過ぎるとわけわかんなくなりそうですね!




感謝致します。
f:id:ogataka50:20140513180621j:plain