您好,登錄后才能下訂單哦!
本文純屬自己記載自己的學習歷程。可能每個人的感受和經歷不一樣。所以僅供大家隨便看看,不要當真就好,認真你就輸O(∩_∩)O~
我剛開始學蘋果開發是公司需要,由于沒人帶,也就看著書上的例子,一個個拖控件拖得不亦樂乎,發現蘋果程序還是蠻好寫的,拖幾下控件就能完成很多功能,但是一直沒有大的進步,因為拖控件,而不是純代碼寫的,控件為什么要這樣拖,為什么這一樣設置類都不知道,只能像背書一樣做,一旦有一點不同,可能就弄不出來,而且只會去一個個比較,而不是去找問題,所以說剛入門用IB拖控件對新手是相當不利的,閑話少說,回到正題。
現在我創建一個名為Simple的project,后面所講的都以這個工程名來說.
iPhone開發建工程,基本沒有一個工程是完全空的,都是至少給了你mainviewcontroller.xib和一個你建的工程的appdelegate(SimpleAppDelegate),這些東西是干什么用的呢,iPhone開發的程序是怎樣啟動的呢,入口是哪里呢?接下來讓我們一步步去分析。
首先,我把有這個空的Project的運行步驟大致描述下,首先運行main函數,運行到UIApplicationMain后,系統就知道去Simple-Info.plist中尋找,然后找到了MainWindow.xib,于是就運行,在MainWindow.xib中設置了他的代理為SimpleAppDelegate,于是啟動SimpleAppDelegate函數,在SimpleAppDelegate.m中的didFinishLaunchingWithOptions方法里面將主界面進行設置,然后工程完成啟動.
現在我們從頭開始寫一個簡單的iPhone程序。以純代碼的方式來向大家呈現(可以參照前面xib的實現).
刪掉所有東西: main函數;
Simple-Info.plist中Mainnibbaswname那一行;
MainWindow.xib;
SimpleAppDelegate的.h和.m文件。
第一步:首先寫main函數
#import <UIKit/UIKit.h>
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv,nil , @"SimpleAppDelegate");
[pool release];
return retVal;
}
int retVal = UIApplicationMain(argc, argv, nil, nil);
這一行的時候,大家注意,UIApplicationMain一共有4個參數,前面兩個不多說大家知道,重要的是第3,4個參數,第三個參數指的是主類(一個UIApplication的子類,一般為nil就可以了,也可以自己定義一個繼承自UIApplication的類SimpleApplication,然后使用[SimpleApplication description]當第三個參數),重點來了,第四個參數是真正做事的類,他是一個代理(也就是前面說的SimpleAppDelegate),指定SimpleAppDelegate程序才能知道接下來是哪個函數來工作,iPhone開發中UIApplication類自己是不做事的,他把所有的事都讓他的代理去做.
第二步創建一個SimpleAppDelegate類(基于NSObject的)
#import <UIKit/UIKit.h>
@interface SimpleAppDelegate : NSObject<UIApplicationDelegate> {
}
@end
可以看到我在類中添加了UIApplicationDelegate,這是因為SimpleAppDelegate必須實現UIApplicationDelegate的方法,而UIApplicationDelegate具體有哪些方法是由系統幫你已經確定好的,所以可以說任何一個iPhone程序都需要實現UIApplicationDelegate這個代理,這樣我們就是用純代碼建立了一個完全空的程序
接下來,我們用這個空的project來實現在界面上顯示一個Hi,APPLE ,
首先我在.m文件里實現UIApplicationDelegate的一個方法applicationDidFinishLaunching:這個方法是程序啟動時調用的.我在 里面實例化了一個window,因為我們需要一個主窗口
#import "SimpleAppDelegate.h"
@implementation SimpleAppDelegate
- (void)applicationDidFinishLaunching:(UIApplication*)application{
UIWindow * window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
[window makeKeyAndVisible];
}
新建一個類NewViewController(基于NSObject)
#import <UIKit/UIKit.h>
@interface NewViewController : UIViewController {
}
@end
因為要顯示在界面上,所以繼承了UIViewController
#import "NewViewController.h"
@implementation NewViewController
-(void)loadView
{
[super loadView];
UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30)];
label.text = @"Hi,APPLE";
[self.view addSubview:label];
[label release];
}
@end
這樣一個純代碼的工程完成,在界面上顯示了Hi,APPLE,view的默認顏色的黑色的,如果想換顏色可以在NewViewController.m的loadView中使用 self.view.backgroundColor = [UIColor yellowColor];
來設置背景色
以下是關于 UIApplicationDelegate的知識,(來源于不知名網友前輩)看了就知道我為什么要用- (void)applicationDidFinishLaunching:(UIApplication*)application這個方法
UIApplicationDelegate是一個協議定義,同樣SampleDelegate也需要實現UIApplicationDelegate中 定義的方法,只是這個協議是系統定義好的(具體可以參看UIApplicationDelegate.h)而SimpleProtocol是我們自己定義 的,但是要做的事情相同,就是SampleDelegate需要去實現這UIApplicationDelegate協議定義好的方法, 這些方法就是UIApplication對象監聽到系統變化的時候通知UIApplication對象代理類SampleDelegate執行的相應方 法。下面是SampleDelegate的實現代碼寫在SampleDelegate.m中:
@implementation SampleDelegate
- (void)applicationWillResignActive:(UIApplication *)application{}
- (void)applicationDidBecomeActive:(UIApplication *)application{}
- (void)applicationDidEnterBackground:(UIApplication *)application{}
- (void)applicationWillEnterForeground:(UIApplication *)application{}
- (void)applicationWillTerminate:(UIApplication *)application{}
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{}
- (void)applicationSignificantTimeChange:(UIApplication*)application{}
- (void)applicationDidFinishLaunching:(UIApplication*)application{}
- (void)application:(UIApplication*)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame{}
- (void)application:(UIApplication*)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration{}
- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url{
return YES;
}
- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation{}
- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame{}
@end
現在來看協議中定義的這些需要實現的方法分別是什么作用:
1、- (void)applicationWillResignActive:(UIApplication *)application
說明:當應用程序將要入非活動狀態執行,在此期間,應用程序不接收消息或事件,比如來電話了
2、- (void)applicationDidBecomeActive:(UIApplication *)application
說明:當應用程序入活動狀態執行,這個剛好跟上面那個方法相反
3、- (void)applicationDidEnterBackground:(UIApplication *)application
說明:當程序被推送到后臺的時候調用。所以要設置后臺繼續運行,則在這個函數里面設置即可
4、- (void)applicationWillEnterForeground:(UIApplication *)application
說明:當程序從后臺將要重新回到前臺時候調用,這個剛好跟上面的那個方法相反。
5、- (void)applicationWillTerminate:(UIApplication *)application
說明:當程序將要退出是被調用,通常是用來保存數據和一些退出前的清理工作。這個需要要設置UIApplicationExitsOnSuspend的鍵 值。
6、- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
說明:iPhone設備只有有限的內存,如果為應用程序分配了太多內存操作系統會終止應用程序的運行,在終止前會執行這個方法,通常可以在這里進行內存清 理工作防止程序被終止
7、- (void)applicationSignificantTimeChange:(UIApplication*)application
說明:當系統時間發生改變時執行
8、- (void)applicationDidFinishLaunching:(UIApplication*)application
說明:當程序載入后執行
9、- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame
說明:當StatusBar框將要變化時執行
10、- (void)application:(UIApplication*)application willChangeStatusBarOrientation:
(UIInterfaceOrientation)newStatusBarOrientation
duration:(NSTimeInterval)duration
說明:當StatusBar框方向將要變化時執行
11、- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url
說明:當通過url執行
12、- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
說明:當StatusBar框方向變化完成后執行
13、- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame
說明:當StatusBar框變化完成后執行
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。