2015年3月19日 星期四

[IOS] Cocoa iOS App 的 Life Cycle 及通知 Controller 目前 App 的狀態 (轉貼)

來源: http://kelp.phate.org/2012/01/cocoa-ios-app-life-cycle-controller-app.html

☆ 最近發現 GitHub 實在太強大了,真的是一個能取代 Blog 的服務,未來大概只會更新到 GitHub 上。
https://github.com/kelp404

2012-01-25


Cocoa iOS App 的 Life Cycle 及通知 Controller 目前 App 的狀態

在開發 iOS App 的時候如果專案選擇 View Application 時 Xcode 會幫我們完成圖形化介面的相關程式,所以一執行就會看到程式的畫面。
在 main.m 中有這樣一段程式用來初始化圖形介面:
1
2
3
4
5
6
int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([ProjectAppDelegate class]));
    }
}
啟動之後接下來都交由 ProjectAppDelegate(ProjectAppDelegate.m) 來掌控程式的執行,當使用者按下 Home 扭讓程式進入背景狀態或是把程式從背景叫回來...等 ProjectAppDelegate 都會收到對應的事件。
官方說明文件 - 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 就能執行對應的程式

沒有留言:

張貼留言