2012-04-27 18 views
15

私はアプリを起動したとき、私はちょうどapplicationDidBecomeActiveが呼び出されたときに、現在のアクティブなビューコントローラ上のviewDidLoadまたはviewDidAppearを呼び出したいので、私はいくつかのアニメーションまたは何をリセットすることができapplicationDidBecomeActiveが呼び出されたときにアクティブビューコントローラに通知する方法は?

...私はここにトリックをしないのです感じますバックグラウンドから再び上昇する。私の見解の中には気にしないものもあれば、実際に知る必要があるものもあります。

私はストーリーボードを使用していますが、私のアプリケーションデリゲートファイルには標準機能がありますが、すべてがEMPTYボディです。たとえば、didFinishLaunchingWithOptionsは単にYESを返し、それ以外は何もしません。ストーリーボードは私が思うすべてを自動的に行います。

私の現在のビューコントローラーは、空白の無情報アプリデリゲートからどのように話すことができますか?

+0

は非常によくこれを行うための簡単な方法があるかもしれませんが、私はあなたのアプリデリゲート@property(強い、非アトミック)のUIViewController * currentViewControllerにプロパティを追加する場合、それが働くだろうと思います。そして、ビューをロードするたびに、そのプロパティを設定するためにデリゲートにコールバックします。そして、applicationWillResignActiveで、それをNSUserDefaultsに保存し、アプリケーションが再びアクティブになったときに値をチェックしますか? – geraldWilliam

答えて

20

通知の使用をお勧めします。このコードに入れアプリデリゲートのapplicationdidBecomeActive方法で

[[NSNotificationCenter defaultCenter] postNotificationName:@"appDidBecomeActive" object:nil]; 

現在のアクティブなView Controllerのinitメソッドでは、通知をサブスクライブします。

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(updateStuff)   
              name:@"appDidBecomeActive" 
              object:nil]; 

コントローラに「updateStuff」メソッドを実装すると、アプリケーションがアクティブになったときに必要な操作を行うことができます。

+0

すごくうまくいってくれてありがとう、ありがとう、提案されたものの最もきれいなアプローチに見えた。私は観察者を正しく取り除くことに少し心配していますが。私は多くのViewControllerをモーダルで使用しているので、たくさんのロードとアンロードが行われます。 - (void)viewDidUnloadでaddObserverを - (void)viewDidLoad removeObserverを呼び出します。 OKの仕事をしているようだ。私はさらにテストします... –

+0

[[NSNotificationCenter defaultCenter] removeObserver:self name:@ "appDidBecomeActive" object:nil];を実行することを忘れないでください。 viewDidUnload内で –

+2

viewDidUnloadが多くのシナリオで呼び出されることはないので、deallocでremoveObserverを忘れる必要はありません。 –

0

現在のViewControllerを追跡するのではなく、AppDelegateからNSNotificationを送信し、ViewControllerでサブスクライブすることができます。そのようにして、View ControllerはviewDidAppearを呼び出す必要があるかどうかを追跡します。

+0

はい、これは私が行ったことです。私のコントローラーのほとんどが登録する必要がないので、完全な意味があります。 –

0

AppDelegateにはウィンドウプロパティがあり、そのウィンドウにはrootViewControllerプロパティがあります。ここであなたのviewControllerを見つけることができます。

TabBarControllerを使用している場合、rootviewcontrollerはtabbarcontrollerになり、tabbarcontrollerのselectedViewControllerを呼び出して現在のviewControllerを取得できます。

UIViewController *rootViewController = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; 
if ([rootViewController isKindOfClass:[UITabBarController Class]]) 
    rootViewController = ((UITabBarController *)rootViewController).selectedViewController; 
else if ([rootViewController isKindOfClass:[UINavigationController Class]]) 
    rootViewController = ((UINavigationController *)rootViewController).topViewController; 

[rootViewController viewDidAppear]; 

あなたはナビゲーションコントローラ、またはモーダルビューのより複雑なビュー階層を持っている場合は、あなたがpresentedViewController、またはtopViewControllerに呼び出すことができます。

+0

このウィンドウのプロパティは私のために働いていない、それは私にこのエラーを与える:宣言されていない識別子 'ウィンドウ'の使用。どのビューが画面上にあるのかを知り、それを更新する必要があるので、答えを更新してください。 – Hamid

+0

@Rose更新を参照してください –

+0

更新のおかげで、私はそれを変更し、次のように例外がスローされます: '認識されたセレクタはインスタンスに送られました' :(このコード行の場合:UIViewController * vc = tabbarController.selectedViewController; – Hamid

51

代わりにアプリのデリゲートからの通知を送信するのでは、OSはあなたが観察できることを自動的に通知を送信します。

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(initSongInfo) 
              name:UIApplicationDidBecomeActiveNotification 
              object:nil]; 

そしてもちろん呼び出すことによって、あなたのdeallocメソッドの前または内部でいつか観察を停止することを確認してください:

[[NSNotificationCenter defaultCenter] removeObserver:self 
               name:UIApplicationDidBecomeActiveNotification 
               object:nil]; 
+3

Brandon Brodjeskiの現在受け入れられている回答よりも優れた解決策です。 – MattyG

+2

これは適切な方法です – nilloc

1

スウィフトバージョン:あなたのviewDidLoadで、この行を追加することができます

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(viewDidBecomeActive), name: UIApplicationDidBecomeActiveNotification, object: nil) 

func viewDidBecomeActive(){ 
    print("viewDidBecomeActive") 
} 
関連する問題