我最近一直都有在看关于IOS项目的知识,今天也总算是迎来了我的第一个IOS项目。不巧这个项目并不是从头开始开发,而是在基础上维护并添加一些模块。
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" alt="" />
噗~不管怎么样,还是来分析分析一下源码吧~我这里首先看到的是AppDelegate_iPad.m下的didFinishLaunchingWithOptions方法,这个方法顾名思义应该是应用启动加载完成后所执行的一个方法。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //[NSUserDefaults standardUserDefaults] 获取用户的一些配置信息 if([[[NSUserDefaults standardUserDefaults] stringForKey:@"AddresstheText"] length]==0){ [[NSUserDefaults standardUserDefaults] setObject:@"http://xxxx.com" forKey:@"AddresstheText"]; [[NSUserDefaults standardUserDefaults] synchronize]; } [[NSUserDefaults standardUserDefaults] setObject:@"wangmin" forKey:@"userNameValue"]; [[NSUserDefaults standardUserDefaults] setObject:@"1111" forKey:@"useridValue"]; [[NSUserDefaults standardUserDefaults] synchronize]; FFADSViewController * controller = [[[FFADSViewController alloc] init] autorelease]; //initWithRootViewController的参数API是这样说的,大概就是什么controller都可以,但不能是tabbarcontroller //The root view controller that is pushed on the stack with no animation. It cannot be an instance of tab bar controller. UINavigationController * nav = [[UINavigationController alloc] initWithRootViewController:controller]; //不要显示navigationcontroller的bar [nav setNavigationBarHidden:YES]; //UIDevice可以获取当前设备信息 if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0){ [self.window addSubview:nav.view]; }else{ self.window.rootViewController = nav; } [self.window makeKeyAndVisible]; return YES; }
接下来稍微的扫一下盲,NSUserDefualts standardUserDefualts是什么呢?
NSUserDefaults standardUserDefaults用来记录一下永久保留的数据非常方便,不需要读写文件,而是保留到一个NSDictionary字典里,由系统保存到文件里,系统会保存到该应用下的/Library/Preferences/gongcheng.plist文件中。需要注意的是如果程序意外退出,NSUserDefaultsstandardUserDefaults数据不会被系统写入到该文件,不过可以使用[[NSUserDefaultsstandardUserDefaults] synchronize]命令直接同步到文件里,来避免数据的丢失。接下来我们来看FFADSViewController~!往下走!GO!
#import "FFADSViewController.h" #import "FFLrcController.h" @implementation FFADSViewController -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:YES]; [self.navigationController setNavigationBarHidden:YES animated:NO]; } //这个页就相当于app进入login页面之前,需要缓冲一些数据会在这个页面停留1-2秒种 - (void)loadView { [super loadView]; CGRect frame = CGRectMake(0, 0, 768, 1024); UIImage * image = [UIImage imageNamed:@"ipadguodu"]; UIImageView * imageView = [[UIImageView alloc] initWithImage:image]; CGRect imageFrame = frame; imageView.frame = imageFrame; imageView.tag = 100; //addSubview 添加子视图 [self.view addSubview:imageView]; [imageView release]; //延迟2秒钟后执行toController [self performSelector:@selector(toController) withObject:nil afterDelay:2]; } -(void)toController{ FFLrcController *publish = [[FFLrcController alloc]init]; UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:publish]; //presentModalViewController:弹出视图 [self presentModalViewController:nav animated:NO]; [publish release]; } - (void)dealloc { [super dealloc]; } @end
这个controller很简单,继续往下走FFLrcController估计就是登录页面了,真是不容易啊!走了好多路才到了登录界面。登录页面首先执行的是loadView事件
注:remember、login、personnumber、password、state等属性都已经在FFLrcController.h中定义
- (void)loadView { [super loadView];//隐藏导航bar [self.navigationController setNavigationBarHidden:YES animated:NO]; //设置背景颜色 self.view.backgroundColor=[UIColor colorWithRed:235/255.0 green:232/255.0 blue:222/255.0 alpha:1]; //label,设置相应的字体颜色背景等等信息 UILabel *remember=[[UILabel alloc]initWithFrame:CGRectMake(100, 733, 150, 30)]; remember.textColor=[UIColor colorWithRed:189/255.0 green:183/255.0 blue:167/255.0 alpha:1]; remember.text=@"记住登录状态"; [self.view addSubview:remember]; [remember release]; //登陆 login = [[UITextField alloc] initWithFrame:CGRectMake(345, 452, 300, 40)]; login.backgroundColor = [UIColor clearColor]; login.borderStyle = UITextBorderStyleRoundedRect; login.borderStyle=UITextBorderStyleNone; //“委托的意思不就是自己的任务交给其他人去做么” //对象.delegate=self的意思就是对象的任务交给self去做 对象!=self login.delegate = self; login.keyboardType = UIKeyboardTypeDefault; // use the default type input method (entire keyboard) login.placeholder=@"姓名"; login.returnKeyType = UIReturnKeyDone; [self.view addSubview:login]; personnumber = [[UITextField alloc] initWithFrame:CGRectMake(345, 545, 300, 40)]; personnumber.backgroundColor = [UIColor clearColor]; personnumber.borderStyle = UITextBorderStyleRoundedRect; personnumber.borderStyle=UITextBorderStyleNone; personnumber.delegate = self; personnumber.keyboardType = UIKeyboardTypeDefault; // use the default type input method (entire keyboard) personnumber.placeholder=@"身份证号码"; personnumber.returnKeyType = UIReturnKeyDone; [self.view addSubview:personnumber]; //密码 password = [[UITextField alloc] initWithFrame:CGRectMake(345, 636, 300, 40)]; password.secureTextEntry=YES; password.backgroundColor = [UIColor clearColor]; password.borderStyle = UITextBorderStyleRoundedRect; password.delegate = self; password.borderStyle=UITextBorderStyleNone; password.keyboardType = UIKeyboardTypeDefault; // use the default type input method (entire keyboard) password.placeholder=@"密码"; password.returnKeyType = UIReturnKeyDone; [self.view addSubview:password];//记住状态 state = [UIButton buttonWithType:UIButtonTypeCustom]; state.frame =CGRectMake(50, 720, 52, 52); //UIControlEventTouchDown事件后会转跳到remember方法中做处理 [state addTarget:self action:@selector(remember) forControlEvents:UIControlEventTouchDown]; [state setBackgroundImage:[UIImage imageNamed:@"ipadcheckLogin"] forState:UIControlStateNormal]; [self.view addSubview:state]; //登陆按钮 UIButton *check = [UIButton buttonWithType:UIButtonTypeCustom]; check.frame =CGRectMake(350, 725, 319, 72); [check.titleLabel setFont:[UIFont boldSystemFontOfSize:18]]; //UIControlEventTouchDown事件后会执行goHome [check addTarget:self action:@selector(goHome) forControlEvents:UIControlEventTouchDown]; [check setBackgroundImage:[UIImage imageNamed:@"ipadlogin_btn"] forState:UIControlStateNormal]; [self.view addSubview:check]; //他这里condition方法编写的是假如有记住密码则将配置文件里的信息读取到UITextField当中 [self condition]; }
FFLrcController.h ---> goHome事件
- (void)goHome { //交出第一响应的身份,可能是回收键盘操作 [login resignFirstResponder]; [personnumber resignFirstResponder]; [password resignFirstResponder]; //SVProgressHUD 是一个第三方的控件,是一个弹出提示层,用来提示网络加载或提示对错 [SVProgressHUD showWithStatus:@"数据加载中..." maskType:SVProgressHUDMaskTypeClear]; //不重复,只调用一次。timer运行一次就会自动停止运行 timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(loginTO) userInfo:nil repeats:NO]; }
FFLrcController.h ---> loginTO事件
-(void)loginTO{ //设置URL 这里相当于 http://xxxx.com/CheckLogin/index/type/name/001/IDcardNO/331004xxxxxxxx/password/001/uuid/e1e2ed3sgfw2/macaddress/192.168.1.1/checkword/?p=ui
//总之这个根据服务器具体所需要的url来配置 NSString *urlString=[NSString stringWithFormat:@"%@/CheckLogin/index/type//name/%@/IDcardNO/%@/password/%@/uuid/%@/macaddress/%@/checkword/?p=ui"
,@"http://xxxx.com",login.text,personnumber.text,password.text,[self getUUID],[self getMacAddress]]; //NSLog(@"urlString %@",urlString); NSURL *url=[NSURL URLWithString:urlString]; //ASIHTTPRequest类库中的ASIFormDataRequest是实现HTTP协议中的处理POST表单的很好的类库。 ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:url]; [request setDelegate:self]; //成功后调用dataFetchComplete [request setDidFinishSelector:@selector(dataFetchComplete:)]; //失败后调用dataFail [request setDidFailSelector:@selector(dataFail:)]; [request setTimeOutSeconds:60]; [[SEAOperationQueue mainQueue] addOperation:request]; [request release]; }
FFLrcController.h ---> dataFetchComplete事件
- (void)dataFetchComplete:(ASIHTTPRequest *)request { //隐藏进度条框 [SVProgressHUD dismiss]; //从服务器中得到的数据是二进制的 NSData * data = [request responseData]; if (data) {//从服务器得到返回的数据转UTF-8,这里为什么不是json,竟然带有html的 NSString *myString = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding]; //这里过滤掉一些标签如:<script></script>等 //使用NSString的stringByReplacingOccurrencesOfString:@"要过滤的" withString:@"替换成的"方法 //以下省略9行过滤代码if ([myString isEqualToString:@"您的身份证号码有误!"]) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"身份证号码输入错误" delegate:nil cancelButtonTitle:@"确认" otherButtonTitles:nil, nil]; [alert show]; [alert release]; return; }else if ([myString isEqualToString:@"用户名或密码输入错误!"]) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"登陆信息输入错误" delegate:nil cancelButtonTitle:@"确认" otherButtonTitles:nil, nil]; [alert show]; [alert release]; return; }else if ([myString hasPrefix:@"/userid"]) { myString=[myString stringByReplacingOccurrencesOfString:@"/userid/" withString:@""]; if (flag) { [[NSUserDefaults standardUserDefaults] setObject:@"true" forKey:@"flag"]; [self writeUser]; }else{ [[NSUserDefaults standardUserDefaults] setObject:@"false" forKey:@"flag"]; } //记录登陆时间写入配置文件 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"YYYY-MM-dd"]; NSString *timestamp = [formatter stringFromDate:[NSDate date]]; NSString *countTime=@"上次登陆:"; countTime=[countTime stringByAppendingString:timestamp]; [[NSUserDefaults standardUserDefaults] setObject:countTime forKey:@"loginTime"]; [formatter release]; //这里登陆成功后,写入一些信息到配置文件。这里省去一些代码 FFFFSwitchViewController *controller = [[FFFFSwitchViewController alloc]init]; controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self.navigationController pushViewController:controller animated:YES]; [controller release]; } } }
可以看到接下来就是FFFFSwitchViewController
----明天继续写