iOS程序启动流程
main函数是程序的入口
任何一个程序,无论是基于Mac OS还是iOS,程序都是从main.m文件的main函数开始执行的。
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil,
NSStringFromClass([AppDelegate class]));
}
}
执行UIApplicationMain函数时做了跳转,转到了AppDelete中.
UIApplicationMain在程序入口函数main函数中调用,主要实现了3个功能:
1.创建应用程序(UIApplication)实例
2.创建应用程序代理实例
3.建立事件循环(runloop: 死循环,不断检测程序运行状态,是否被触摸、晃动等
UIApplicationMain剖析
int UIApplicationMain (!
int argc,!
char *argv[],!
NSString *principalClassName,!
NSString *delegateClassName!
);!
1.principalClassName:应用程序对象的类名(UIApplication或其子类)
2.delegateClassName:应用程序delegate的类名.(任何接受了 UIApplicationDelegate的类)
UIApplicationMain根据上述两个类名创建应用程序实例、应用程序代理实例。
然后建立事件循环(runloop),检测程序的各种事件(程序开始启动,接收到触摸等等)
应用程序代理,主要检测应用程序的状态并做出相应的处理。
应用程序的状态有很多,比如: 程序启动、进入活跃状态、进到后台、内存警告、收到远程消息等等
任何接受了UIApplicationDelegate协议的对象都可以成为应用程序代理.一旦应用程序的某种状态触发,就会执行相应的代理方法
UIApplicationDelegate是一个OC的协议.里面声明了一堆方法,这些方法都与应用程序运行状态有关,它们由应用程序代理实现,UIApplication 对象负责调用。
UIApplicationDelegate:
application:didFinishLaunchingWithOptions:
// 告诉delegate程序启动即将完成,程序准备要运行(delegate实现这个⽅法时,要创建window对象,将程序内容通过window呈现给用户)
applicationDidBecomeActive:
// 告诉delegate应用程序已经进入活跃状态(重新执行被暂停的任务)
applicationWillResignActive:
// 告诉delegate应用程序即将进入非活跃状态(暂停游戏、停⽌timer等)
applicationDidEnterBackground:
// 告诉delegate应⽤程序已经进入到了后台(存储用户数据、释放一些共享资源、停止timer等)
applicationWillEnterForeground:
// 告诉delegate应用程序即将进入前台(取消所有进入后台时暂停的任务)
delegate是iOS重要的设计模式,理解它的原理,有助于写出优质代码
点击键盘return按钮实现键盘回收的步骤:
1、将AppDelete作为UITextField的delegate
2、AppDelete.h⽂件接受UITextFieldDelegate协议
3、AppDelete.m⽂件实现textFieldShouldReturn:方法
AppDelegate.m
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES; }
UITextField不应该在类内部(.m⽂件)实现textFieldShouldReturn:, 因为有时候,我们点return的时候,并不总是想回收键盘,例如:有两个输⼊框,第一个输入框输入完成之后,用户点return按钮,将光标移动到第二个输入框(即:第二个输入框称为第一响应者)
对于一个V来说,自己只负责触发事件,事件由外界实现,即 delegate。
#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (void)dealloc
{
[_window release];
[super dealloc];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor purpleColor];
[self.window makeKeyAndVisible];
[_window release];
// API(Application Programming Interface) 应用程序编程接口
// UITextField提供给我们用于文本显示的API包括字体颜色,对齐方式,占位符等
// UITextField提供给我们控制输入的API包括密码模式,键盘样式,自定义键盘
// UITextField提供给我们外观控制的API包括边框样式,清除按钮,辅助视图
UITextField *textField= [[UITextField alloc] initWithFrame:CGRectMake(120, 180, 140, 40)];
textField.backgroundColor = [UIColor magentaColor];
// 用户界面文本边框样式 RoundedRect:圆角矩形 Bezel:面板 Line:边缘线
textField.borderStyle = UITextBorderStyleRoundedRect;
[_window addSubview:textField];
[textField release];
// textField.layer.borderWidth = 1;
// textField.layer.cornerRadius = 5;
// 设置文本
// 显示文本的内容
textField.text = @"天天酷跑";
// 文本颜色
textField.textColor = [UIColor blueColor];
// 占位文本(这个很好用)
// 占位文本可以改颜色吗?
textField.placeholder = @"密室逃脱";
// 文本的对齐方式
textField.textAlignment = NSTextAlignmentCenter;
// 文本字体
textField.font = [UIFont systemFontOfSize:24];
// 是否允许输入
// textField.enabled = NO; // 默认是YES;设置成NO不允许输入,不弹出键盘
// 是否加密
// textField.secureTextEntry = YES; // 密码格式
// 设置弹出不同的键盘类型(枚举值)
// textField.keyboardType = UIKeyboardTypeNumberPad;
// UIKeyboardTypeDefault, // 当前类型为输入法的默认类型
// Default type for the current input method.
// UIKeyboardTypeASCIICapable, // 显示一个键盘,可以输入字符的ASCII码,非ASCII键盘保持活跃
// Displays a keyboard which can enter ASCII characters,non-ASCII keyboards remain active
// UIKeyboardTypeNumbersAndPunctuation, // 数字和标点符号
// Numbers and assorted punctuation.
// UIKeyboardTypeURL, // 一种优化的网址输入(突出显示网址类型./.COM)
// A type optimized for URL entry (shows . / .com prominently).
// UIKeyboardTypeNumberPad, // 数字键0到9,适用于输入PIN码
// A number pad (0-9). Suitable for PIN entry.
// UIKeyboardTypePhonePad, // 一个手机垫(1-9,*,0,#,字母在数字下)
// A phone pad (1-9, *, 0, #, with letters under the numbers).
// UIKeyboardTypeNamePhonePad, // 输入一个人姓名或电话号码的类型。
// A type optimized for entering a person's name or phone number.
// UIKeyboardTypeEmailAddress, // 输入电子邮件地址的类型(突出显示符号@)。
// A type optimized for multiple email address entry (shows space @ . prominently).
// UIKeyboardTypeDecimalPad NS_ENUM_AVAILABLE_IOS(4_1),
// A number pad with a decimal point. 带小数点的数字键盘。
// UIKeyboardTypeTwitter NS_ENUM_AVAILABLE_IOS(5_0), // 对于推特文本输入的优化型(容易获得@ #)
// A type optimized for twitter text entry (easy access to @ #)
// UIKeyboardTypeWebSearch NS_ENUM_AVAILABLE_IOS(7_0),
// A default keyboard type with URL-oriented addition (shows space . prominently). 一个面向链接添加的默认键盘类型(突出显示空格)
// UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable,
// Deprecated 弃用的
// 点击return按钮回收键盘
// 改变return按钮类型
textField.returnKeyType = UIReturnKeySearch;
// UIReturnKeyDefault,
// UIReturnKeyGo,
// UIReturnKeyGoogle,
// UIReturnKeyJoin,
// UIReturnKeyNext,
// UIReturnKeyRoute, // 路线
// UIReturnKeySearch,
// UIReturnKeySend,
// UIReturnKeyYahoo,
// UIReturnKeyDone,
// UIReturnKeyEmergencyCall, // 紧急呼叫
// 是否初始化时清空输入框内容
// textField.clearsOnBeginEditing = NO;
textField.clearsOnBeginEditing = YES;
// 在其中加入一键删除功能
textField.clearButtonMode = UITextFieldViewModeAlways;
// UITextFieldViewModeAlways // 总是显示清除按钮
// UITextFieldViewModeWhileEditing // 当编辑时
// UITextFieldViewModeUnlessEditing // 不在编辑时
// 创建一个view
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 195)];
view.backgroundColor = [UIColor cyanColor];
// 弹出一个自定义的输入视图,默认是键盘
// textField.inputView = view;
// 给键盘添加一个辅助视图(在输入视图的上方),默认为无
// textField.inputAccessoryView = view; // 只有视图的高有影响,其他任意
// 键盘高度大约215 键盘帮助界面高度大概有35
// 输入框左右视图,及其显示模式,这两个视图是在输入框内部(即以textField为父视图)
// 干嘛用的?
textField.leftView = view; // 始终紧贴输入框左端,且以左端中点为中心点
textField.leftViewMode = UITextFieldViewModeAlways;
// 给textfield设置代理人
textField.delegate = self;
return YES;
}
// 实现协议方法
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
NSLog(@"测试return按钮");
// 这句话是实现回收键盘的关键
[textField resignFirstResponder];
return YES;
}
- (BOOL)textFieldShouldClear:(UITextField *)textField
{
NSLog(@"测试clear按钮");
return YES;
}
@end