2012-01-25
Cocoa iOS App 的 Life Cycle 及通知 Controller 目前 App 的狀態
在開發 iOS App 的時候如果專案選擇 View Application 時 Xcode 會幫我們完成圖形化介面的相關程式,所以一執行就會看到程式的畫面。
在 main.m 中有這樣一段程式用來初始化圖形介面:
啟動之後接下來都交由 ProjectAppDelegate(ProjectAppDelegate.m) 來掌控程式的執行,當使用者按下 Home 扭讓程式進入背景狀態或是把程式從背景叫回來...等 ProjectAppDelegate 都會收到對應的事件。
官方說明文件 - UIApplicationDelegate Protocol Reference
didFinishLaunchingWithOptions
此事件只會產生一次,在程式第一次被執行的時候
applicationDidBecomeActive
發生於 didFinishLaunchingWithOptions 之後,從背景叫回來時也會產生
applicationWillResignActive
發生於程式要進入背景狀態前,這時候可能要做儲存狀態、暫停遊戲...等,因為使用者有可能會結束程式
applicationDidEnterBackground
發生於程式進入背景狀態後
applicationWillEnterForeground
發生於程式從背景狀態被叫回時,事件結束後會產生 applicationDidBecomeActive
這些事件的程式都放在 ProjectAppDelegate.m 中,如果說發生這些事件後 Controller 要執行對應的程式時遇到的第一個問題就是我該怎麼在 ProjectAppDelegate.m 呼叫 Controller 的函數。
這個問題可以透過 Notification Center 機制來解決,Notification Center 是程式中共用的訊息通知中心,一個程式只會有一個,所以我們可以在 ProjectAppDelegate.m 中的事件塞入通知,而在 Controller 中攔截這個通知並執行對應的程式。
首先要在 Controller 中設定攔截通知的程式
在 ProjectAppDelegate.m 中加入傳送通知的程式,這邊放在 applicationDidBecomeActive 中,也就是程式執行、從背景叫回來時會產生訊息
這樣一來 Controller 就能執行對應的程式
在 main.m 中有這樣一段程式用來初始化圖形介面:
1
2
3
4
5
6
| int main( int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([ProjectAppDelegate class ])); } } |
官方說明文件 - UIApplicationDelegate Protocol Reference
didFinishLaunchingWithOptions
此事件只會產生一次,在程式第一次被執行的時候
1
2
3
4
| - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( NSDictionary *)launchOptions { return YES ; } |
applicationDidBecomeActive
發生於 didFinishLaunchingWithOptions 之後,從背景叫回來時也會產生
1
2
3
4
| - ( void )applicationDidBecomeActive:(UIApplication *)application { } |
applicationWillResignActive
發生於程式要進入背景狀態前,這時候可能要做儲存狀態、暫停遊戲...等,因為使用者有可能會結束程式
1
2
3
4
| - ( void )applicationWillResignActive:(UIApplication *)application { } |
applicationDidEnterBackground
發生於程式進入背景狀態後
1
2
3
4
| - ( void )applicationDidEnterBackground:(UIApplication *)application { } |
applicationWillEnterForeground
發生於程式從背景狀態被叫回時,事件結束後會產生 applicationDidBecomeActive
1
2
3
4
| - ( void )applicationWillEnterForeground:(UIApplication *)application { } |
這些事件的程式都放在 ProjectAppDelegate.m 中,如果說發生這些事件後 Controller 要執行對應的程式時遇到的第一個問題就是我該怎麼在 ProjectAppDelegate.m 呼叫 Controller 的函數。
這個問題可以透過 Notification Center 機制來解決,Notification Center 是程式中共用的訊息通知中心,一個程式只會有一個,所以我們可以在 ProjectAppDelegate.m 中的事件塞入通知,而在 Controller 中攔截這個通知並執行對應的程式。
首先要在 Controller 中設定攔截通知的程式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| - ( void )viewDidLoad { [super viewDidLoad]; //設定通知對應的函數 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(notificationHandle:) name: @ "MainControllerNotificationHandle" object: nil]; } - ( void )viewDidUnload { [super viewDidUnload]; //移除通知對應函數 [[NSNotificationCenter defaultCenter] removeObserver: self ]; } //當 MainControllerNotificationHandle 通知發生時會執行此函數 - ( void ) notificationHandle: (NSNotification*) sender; { NSLog (@ "-notificationHandle" ); } |
在 ProjectAppDelegate.m 中加入傳送通知的程式,這邊放在 applicationDidBecomeActive 中,也就是程式執行、從背景叫回來時會產生訊息
1
2
3
4
5
| - ( void )applicationDidBecomeActive:(UIApplication *)application { NSLog (@ "%@" , @ "applicationDidBecomeActive" ); [[NSNotificationCenter defaultCenter] postNotificationName: @ "MainControllerNotificationHandle" object: @ "DidBecomeActive" ]; } |
這樣一來 Controller 就能執行對應的程式
沒有留言:
張貼留言