一 delegate
- (BOOL)textFieldShouldReturn:(UITextField*)textField{
[ textField resignFirstResponder];
returnYES;
}
二程序的啓動流程
1⃣ main 函數是程序入口
int main(int argc,char * argv[]){
@autoreleasepool{
return UIApplicationMain(argc,argv,nil,NSStringFromClass([
AppDelegate class]));
}
}
執行 UIApplicationMain函數時做了跳轉,轉到 AppDelete中
2⃣ UIApplicationMain在程序入口函數 main 函數中調用,主要實現了3個功能:
①創建應用程序(UIApplication)實例
②創建應用程序代理實例,代理的主要作用是,監聽應用程序是如何執行的.
③建立時間循環(runloop: 死循環,不斷檢測程序運行狀態,是否被觸摸,晃動等)不斷的監聽,直到程序退出爲止.
3⃣ UIApplicationMain 剖析
int UIApplicationMain(
int argc;
char *argv[];
NSString *principalClassName;
NSString *delegateClassName;
)
principalClassName:應用程序對象的類名(UIApplication 或其子類)
delegateClassName:應用程序 delegate 的類名.(任何接受了 UIApplicationDelegate 的類)
UIApplicationMain根據上述兩個類名創建應用程序實例,應用程序代理實例,然後建立事件循環(runloop),檢測程序的各種事件(程序開始啓動,接收到觸摸等等)
4⃣ 應用程序代理,主要檢測應用程序的狀態並做出相應的處理.
應用程序的狀態有很多,比如:程序啓動,進入活躍狀態,進到後臺,內存警告,收到遠程消息
任何接受了 UIApplicationDelegate協議的對象都可以成爲應用程序代理
一旦應用程序的某種狀態觸發,就會執行相應的代理方法.
5⃣ UIApplicationDelegate 是一個 OC 的協議.裏面聲明瞭一堆方法,這些方法都與應用程序運行狀態有關,它們由應用程序代理實現. UIApplication 對象負責調用.
6⃣ UIApplicationDelegate 中的方法:
①- (BOOL)application: (UIApplication*)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions{}
告訴 delegate 程序啓動即將完成,程序準備要運行.(delegate 實現這個方法時,要創建 window 對象,將程序內容通過 window 呈現給用戶)
②- (void)applicationDidBecomeActive:(UIApplication *)application{}
告訴 delegate 應用程序已經進入活躍狀態,(重新執行被暫停的任務)
③- (void)applicationWillResignAction:(UIApplication *)application{}
告訴代理程序即將進入非活躍狀態,(暫停遊戲,停止 timer 等)
④- (void)applicationDidEnterBackground:(UIApplication *)application{}
告訴 delegate 應用程序已經進入到了後臺,(存儲用戶數據,釋放一些共享資源,停止 timer 等)
⑤- (void)applicationWillEnterForeground:(UIApplication *)application{}
告訴delegate 應用程序即將進入前臺(取消所有進入後臺時暫停的任務)
7⃣ 查看各個代理的執行順序.
使用 NSLog(@”%@”,__FUNCTION__,__LINK__);
三 自定義視圖
就是將一些簡單的控件進行組合,編寫出符合自己需求的控件.
要做到(可複用,可移植,可精煉)
在自定義控件的時候,可以將控件封裝到一個類中,進行調用顯示.
下面的是一個 LTVIEW 類控件:
1⃣ 首先在. H 文件中需要定義兩個實例變量
@proterty (retain,nonatomic)UILable *label;
@proterty (retain,nonatomic)UITextField *field;
2⃣ 在. M 文件中封裝控件
- (void)dealloc{
[_textField release];
[_lable release];
[super dealloc];
}
重寫 UIView 的初始化方法
- (id)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if(self){
[self p_setUp];
}
return self;
}
創建方法
- (void)p_setUp{
_label = [[UILabelalloc]initWithFrame:CGRectMake(0, 0, self.frame.size.width/3, self.frame.size.height)];
_label.backgroundColor = [UIColoryellowColor];
[selfaddSubview:_label];
[_labelrelease];
_textField = [[UITextFieldalloc]initWithFrame:CGRectMake(_label.frame.size.width, 0, self.frame.size.width*2/3, self.frame.size.height)];
_textField.backgroundColor = [UIColorredColor];
[selfaddSubview:_textField];
[_textFieldrelease];
}
調用方法:首先引入頭文件
// 使用自定義的視圖類
LTView *view = [[LTView alloc]initWithFrame:CGRectMake(10, 20, 300, 40)];
view.backgroundColor = [UIColor whiteColor];
[self.window addSubview:view];
[view release];
四 視圖控制器
1. 視圖控制器的作用:
1⃣響應事件
2⃣分擔 AppDelegate 的工作
3⃣實現模塊獨立,提高複用性
2. 創建 UIViewController 對象
UIViewController*control = [[UIViewController alloc]init];
UIViewController,自身帶了一個UIView, 默認的大小和屏幕的大小一樣
每個 window 都帶有一個根視圖,如果不給根視圖,默認根視圖就是它本身
設置 self.window 的跟視圖控制器
self.window.rootViewController= control;
設置控制器的背景顏色
control.view.backgroundColor= [UIColor yellowColor];
設置按鈕添加的時候;[control.view addSubview:button];
3. 使用自定義視圖控制器進行操作
MyViewController*control = [[MyViewController alloc]init];
將根視圖控制器設置爲 control
self.window.rootViewController= control;
[controlrelease];
控制器內容如下圖所示:
出事話方法和加載視圖:
實現視圖加載的方法:
內存處理的方法:
重寫 didReceiveMemoryWarning方法:
- (void)didReceiveMemoryWarning{
[superdidReceiveMemoryWarning];
//根視圖已經加載過,根視圖未顯示
if([selfisViewLoaded] == YES && self.view.window == nil)
{
//將根視圖銷燬
self.view= nil;
}
}
4. 創建旋轉視圖控制器
RotationViewController*rotation = [[RotationViewController alloc]init];
將根視圖設置爲 rotation
self.window.rootViewController= rotation;
[rotationrelease];
控制器視圖加載視圖的實現:
屏幕旋轉檢測: