我最近一直都有在看关于IOS项目的知识,今天也总算是迎来了我的第一个IOS项目。不巧这个项目并不是从头开始开发,而是在基础上维护并添加一些模块。
噗~不管怎么样,还是来分析分析一下源码吧~我这里首先看到的是AppDelegate_ipad.m下的didFinishLaunchingWithOptions方法,这个方法顾名思义应该是应用启动加载完成后所执行的一个方法。
-%20(BOOL)application:(UIApplication%20*)application%20didFinishLaunchingWithOptions:(NSDictionary%20*)launchOptions{%20%20%20%20//[NSUserDefaults%20standardUserDefaults]%20获取用户的一些配置信息%20%20%20%20if([[[NSUserDefaults%20standardUserDefaults]%20stringForKey:@"AddresstheText"]%20length]==0){%20%20%20%20%20%20%20%20[[NSUserDefaults%20standardUserDefaults]%20setObject:@"http://xxxx.com"%20forKey:@"AddresstheText"];%20%20%20%20%20%20%20%20[[NSUserDefaults%20standardUserDefaults]%20synchronize];%20%20%20%20}%20%20%20%20[[NSUserDefaults%20standardUserDefaults]%20setObject:@"wangmin"%20forKey:@"userNameValue"];%20%20%20%20[[NSUserDefaults%20standardUserDefaults]%20setObject:@"1111"%20forKey:@"useridValue"];%20%20%20%20[[NSUserDefaults%20standardUserDefaults]%20synchronize];%20%20%20%20%20%20%20%20FFADSViewController%20*%20controller%20=%20[[[FFADSViewController%20alloc]%20init]%20autorelease];%20%20%20%20//initWithRootViewController的参数API是这样说的,大概就是什么controller都可以,但不能是tabbarcontroller%20%20%20%20//The%20root%20view%20controller%20that%20is%20pushed%20on%20the%20stack%20with%20no%20animation.%20It%20cannot%20be%20an%20instance%20of%20tab%20bar%20controller.%20%20%20%20UINavigationController%20*%20nav%20=%20[[UINavigationController%20alloc]%20initWithRootViewController:controller];%20%20%20%20//不要显示navigationcontroller的bar%20%20%20%20[nav%20setNavigationBarHidden:YES];%20%20%20%20//UIDevice可以获取当前设备信息%20%20%20%20if%20(%20[[UIDevice%20currentDevice].systemVersion%20floatValue]%20<%206.0){%20%20%20%20%20%20%20%20[self.window%20addSubview:nav.view];%20%20%20%20}else{%20%20%20%20%20%20%20%20self.window.rootViewController%20=%20nav;%20%20%20%20}%20%20%20%20%20%20%20%20[self.window%20makeKeyAndVisible];%20%20%20%20%20%20%20%20return%20YES;}
接下来稍微的扫一下盲,NSUserDefualts%20standardUserDefualts是什么呢?
接下来我们来看FFADSViewController~!往下走!GO!
#import%20"FFADSViewController.h"#import%20"FFLrcController.h"@implementation%20FFADSViewController-(void)viewWillAppear:(BOOL)animated{%20%20%20%20[super%20viewWillAppear:YES];%20%20%20%20[self.navigationController%20setNavigationBarHidden:YES%20animated:NO];}//这个页就相当于app进入login页面之前,需要缓冲一些数据会在这个页面停留1-2秒种-%20(void)loadView%20{%20%20%20%20[super%20loadView];%20%20%20%20CGRect%20frame%20=%20CGRectMake(0,%200,%20768,%201024);%20%20%20%20UIImage%20*%20image%20=%20[UIImage%20imageNamed:@"ipadguodu"];%20%20%20%20UIImageView%20*%20imageView%20=%20[[UIImageView%20alloc]%20initWithImage:image];%20%20%20%20CGRect%20imageFrame%20=%20frame;%20%20%20%20imageView.frame%20=%20imageFrame;%20%20%20%20imageView.tag%20=%20100;%20%20%20%20//addSubview%20添加子视图%20%20%20%20[self.view%20addSubview:imageView];%20%20%20%20[imageView%20release];%20%20%20%20//延迟2秒钟后执行toController%20%20%20%20[self%20performSelector:@selector(toController)%20withObject:nil%20afterDelay:2];}-(void)toController{%20%20%20%20FFLrcController%20*publish%20=%20[[FFLrcController%20alloc]init];%20%20%20%20UINavigationController%20*nav%20=%20[[UINavigationController%20alloc]initWithRootViewController:publish];%20%20%20%20//presentModalViewController:弹出视图%20%20%20%20[self%20presentModalViewController:nav%20animated:NO];%20%20%20%20[publish%20release];}-%20(void)dealloc%20{%20%20%20%20[super%20dealloc];}@end
这个controller很简单,继续往下走FFLrcController估计就是登录页面了,真是不容易啊!走了好多路才到了登录界面。登录页面首先执行的是loadView事件
注:remember、login、personnumber、passWord、state等属性都已经在FFLrcController.h中定义
-%20(void)loadView%20{%20%20%20%20[super%20loadView];//隐藏导航bar%20%20%20%20[self.navigationController%20setNavigationBarHidden:YES%20animated:NO];%20%20%20%20//设置背景颜色%20%20%20%20self.view.backgroundColor=[UIColor%20colorWithRed:235/255.0%20green:232/255.0%20blue:222/255.0%20alpha:1];%20%20%20%20%20//label,设置相应的字体颜色背景等等信息%20%20%20%20UILabel%20*remember=[[UILabel%20alloc]initWithFrame:CGRectMake(100,%20733,%20150,%2030)];%20%20%20%20remember.textColor=[UIColor%20colorWithRed:189/255.0%20green:183/255.0%20blue:167/255.0%20alpha:1];%20%20%20%20remember.text=@"记住登录状态";%20%20%20%20[self.view%20addSubview:remember];%20%20%20%20[remember%20release];%20%20%20%20//登陆%20%20%20%20login%20=%20[[UITextField%20alloc]%20initWithFrame:CGRectMake(345,%20452,%20300,%2040)];%20%20%20%20login.backgroundColor%20=%20[UIColor%20clearColor];%20%20%20%20login.borderStyle%20=%20UITextBorderStyleRoundedRect;%20%20%20%20login.borderStyle=UITextBorderStyleNone;%20%20%20%20//“委托的意思不就是自己的任务交给其他人去做么”%20%20%20%20//对象.delegate=self的意思就是对象的任务交给self去做%20%20对象!=self%20%20%20%20login.delegate%20=%20self;%20%20%20%20login.keyboardType%20=%20UIKeyboardTypeDefault;%20%20%20%20//%20use%20the%20default%20type%20input%20method%20(entire%20keyboard)%20%20%20%20login.placeholder=@"姓名";%20%20%20%20login.returnKeyType%20=%20UIReturnKeyDone;%20%20%20%20[self.view%20addSubview:login];%20%20%20%20%20%20%20%20personnumber%20=%20[[UITextField%20alloc]%20initWithFrame:CGRectMake(345,%20545,%20300,%2040)];%20%20%20%20personnumber.backgroundColor%20=%20[UIColor%20clearColor];%20%20%20%20personnumber.borderStyle%20=%20UITextBorderStyleRoundedRect;%20%20%20%20personnumber.borderStyle=UITextBorderStyleNone;%20%20%20%20personnumber.delegate%20=%20self;%20%20%20%20personnumber.keyboardType%20=%20UIKeyboardTypeDefault;%20%20%20%20//%20use%20the%20default%20type%20input%20method%20(entire%20keyboard)%20%20%20%20personnumber.placeholder=@"身份证号码";%20%20%20%20personnumber.returnKeyType%20=%20UIReturnKeyDone;%20%20%20%20[self.view%20addSubview:personnumber];%20%20%20%20%20%20%20%20//密码%20%20%20%20password%20=%20[[UITextField%20alloc]%20initWithFrame:CGRectMake(345,%20636,%20300,%2040)];%20%20%20%20password.secureTextEntry=YES;%20%20%20%20password.backgroundColor%20=%20[UIColor%20clearColor];%20%20%20%20password.borderStyle%20=%20UITextBorderStyleRoundedRect;%20%20%20%20password.delegate%20=%20self;%20%20%20%20password.borderStyle=UITextBorderStyleNone;%20%20%20%20password.keyboardType%20=%20UIKeyboardTypeDefault;%20%20%20%20//%20use%20the%20default%20type%20input%20method%20(entire%20keyboard)%20%20%20%20password.placeholder=@"密码";%20%20%20%20password.returnKeyType%20=%20UIReturnKeyDone;%20%20%20%20[self.view%20addSubview:password];//记住状态%20%20%20%20state%20=%20[UIButton%20buttonWithType:UIButtonTypeCustom];%20%20%20%20state.frame%20=CGRectMake(50,%20720,%2052,%2052);%20%20%20%20//UIControlEventTouchDown事件后会转跳到remember方法中做处理%20%20%20%20[state%20addTarget:self%20action:@selector(remember)%20forControlEvents:UIControlEventTouchDown];%20%20%20%20[state%20setBackgroundImage:[UIImage%20imageNamed:@"ipadcheckLogin"]%20forState:UIControlStateNormal];%20%20%20%20[self.view%20addSubview:state];%20%20%20%20%20%20%20%20//登陆按钮%20%20%20%20UIButton%20*check%20=%20[UIButton%20buttonWithType:UIButtonTypeCustom];%20%20%20%20check.frame%20=CGRectMake(350,%20725,%20319,%2072);%20%20%20%20[check.titleLabel%20setFont:[UIFont%20boldSystemFontOfSize:18]];%20%20%20%20//UIControlEventTouchDown事件后会执行goHome%20%20%20%20[check%20addTarget:self%20action:@selector(goHome)%20forControlEvents:UIControlEventTouchDown];%20%20%20%20[check%20setBackgroundImage:[UIImage%20imageNamed:@"ipadlogin_btn"]%20forState:UIControlStateNormal];%20%20%20%20[self.view%20addSubview:check];%20%20%20%20//他这里condition方法编写的是假如有记住密码则将配置文件里的信息读取到UITextField当中%20%20%20%20[self%20condition];}
FFLrcController.m%20---> %20goHome事件
-%20(void)goHome%20{%20%20%20%20//交出第一响应的身份,可能是回收键盘操作%20%20%20%20[login%20resignFirstResponder];%20%20%20%20[personnumber%20resignFirstResponder];%20%20%20%20[password%20resignFirstResponder];%20%20%20%20//SVProgressHUD%20是一个第三方的控件,是一个弹出提示层,用来提示网络加载或提示对错%20%20%20%20[SVProgressHUD%20showWithStatus:@"数据加载中..."%20maskType:SVProgressHUDMaskTypeClear];%20%20%20%20//不重复,只调用一次。timer运行一次就会自动停止运行%20%20%20%20timer%20=%20[NSTimer%20scheduledTimerWithTimeInterval:0.1%20target:self%20selector:@selector(loginTO)%20userInfo:nil%20repeats:NO];%20}
FFLrcController.m%20---> %20loginTO事件
-(void)loginTO{%20%20%20%20//设置URL%20这里相当于%20http://xxxx.com/CheckLogin/index/type/name/001/IDcardNO/331004xxxxxxxx/password/001/uuid/e1e2ed3sgfw2/macaddress/192.168.1.1/checkword/?p=ui
//总之这个根据服务器具体所需要的url来配置%20%20%20%20NSString%20*urlString=[NSString%20stringWithFormat:@"%@/CheckLogin/index/type//name/%@/IDcardNO/%@/password/%@/uuid/%@/macaddress/%@/checkword/?p=ui"
,@"http://xxxx.com",login.text,personnumber.text,password.text,[self%20getUUID],[self%20getMacAddress]];%20%20%20%20//NSLog(@"urlString%20%@",urlString);%20%20%20%20NSURL%20*url=[NSURL%20URLWithString:urlString];%20%20%20%20//ASIHTTPRequest类库中的ASIFormDataRequest是实现HTTP协议中的处理POST表单的很好的类库。%20%20%20%20ASIFormDataRequest%20*request%20=%20[[ASIFormDataRequest%20alloc]%20initWithURL:url];%20%20%20%20[request%20setDelegate:self];%20%20%20%20//成功后调用dataFetchComplete%20%20%20%20[request%20setDidFinishSelector:@selector(dataFetchComplete:)];%20%20%20%20//失败后调用dataFail%20%20%20%20[request%20setDidFailSelector:@selector(dataFail:)];%20%20%20%20[request%20setTimeOutSeconds:60];%20%20%20%20[[SEAOperationQueue%20mainQueue]%20addOperation:request];%20%20%20%20[request%20release];}
FFLrcController.m%20---> %20dataFetchComplete事件
-%20(void)dataFetchComplete:(ASIHTTPRequest%20*)request{%20%20%20%20//隐藏进度条框%20%20%20%20[SVProgressHUD%20dismiss];%20%20%20%20//从服务器中得到的数据是二进制的%20%20%20%20NSData%20*%20data%20=%20[request%20responseData];%20%20%20%20if%20(data)%20{
%20%20%20%20%20%20%20%20//从服务器得到返回的数据转UTF-8,这里为什么不是json,竟然带有html的%20%20%20%20%20%20%20%20NSString%20*myString%20=%20[[NSString%20alloc]%20initWithBytes:[data%20bytes]%20length:[data%20length]%20encoding:NSUTF8StringEncoding];%20%20%20%20%20%20%20%20//这里过滤掉一些标签如:<script></script>等%20%20%20%20%20%20%20%20//使用NSString的stringByReplacingOccurrencesOfString:@"要过滤的"%20withString:@"替换成的"方法%20%20%20%20%20%20%20%20//以下省略9行过滤代码
%20if%20([myString%20isEqualToString:@"您的身份证号码有误!"])%20{%20%20%20%20%20%20%20%20%20%20%20%20UIAlertView%20*alert%20=%20[[UIAlertView%20alloc]%20initWithTitle:@"提示"%20message:@"身份证号码输入错误"%20delegate:nil%20cancelButtonTitle:@"确认"%20otherButtonTitles:nil,%20nil];%20%20%20%20%20%20%20%20%20%20%20%20[alert%20show];%20%20%20%20%20%20%20%20%20%20%20%20[alert%20release];%20%20%20%20%20%20%20%20%20%20%20%20return;%20%20%20%20%20%20%20%20}else%20%20if%20([myString%20isEqualToString:@"用户名或密码输入错误!"])%20{%20%20%20%20%20%20%20%20%20%20%20%20UIAlertView%20*alert%20=%20[[UIAlertView%20alloc]%20initWithTitle:@"提示"%20message:@"登陆信息输入错误"%20delegate:nil%20cancelButtonTitle:@"确认"%20otherButtonTitles:nil,%20nil];%20%20%20%20%20%20%20%20%20%20%20%20[alert%20show];%20%20%20%20%20%20%20%20%20%20%20%20[alert%20release];%20%20%20%20%20%20%20%20%20%20%20%20return;%20%20%20%20%20%20%20%20}else%20if%20([myString%20hasprefix:@"/userid"])%20{%20%20%20%20%20%20%20%20%20%20%20%20myString=[myString%20stringByReplacingOccurrencesOfString:@"/userid/"%20withString:@""];%20%20%20%20%20%20%20%20%20%20%20%20if%20(flag)%20{%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20[[NSUserDefaults%20standardUserDefaults]%20setObject:@"true"%20forKey:@"flag"];%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20[self%20writeUser];%20%20%20%20%20%20%20%20%20%20%20%20}else{%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20[[NSUserDefaults%20standardUserDefaults]%20setObject:@"false"%20forKey:@"flag"];%20%20%20%20%20%20%20%20%20%20%20%20}%20%20%20%20%20%20%20%20%20%20%20%20//记录登陆时间写入配置文件%20%20%20%20%20%20%20%20%20%20%20%20NSDateFormatter%20*formatter%20=%20[[NSDateFormatter%20alloc]%20init];%20%20%20%20%20%20%20%20%20%20%20%20[formatter%20setDateFormat:@"YYYY-MM-dd"];%20%20%20%20%20%20%20%20%20%20%20%20NSString%20*timestamp%20=%20[formatter%20stringFromDate:[NSDate%20date]];%20%20%20%20%20%20%20%20%20%20%20%20NSString%20*countTime=@"上次登陆:";%20%20%20%20%20%20%20%20%20%20%20%20countTime=[countTime%20stringByAppendingString:timestamp];%20%20%20%20%20%20%20%20%20%20%20%20[[NSUserDefaults%20standardUserDefaults]%20setObject:countTime%20forKey:@"loginTime"];%20%20%20%20%20%20%20%20%20%20%20%20[formatter%20release];%20%20%20%20%20%20%20%20%20%20%20%20//这里登陆成功后,写入一些信息到配置文件。这里省去一些代码%20%20%20%20%20%20%20%20%20%20%20%20FFFFSwitchViewController%20*controller%20=%20[[FFFFSwitchViewController%20alloc]init];%20%20%20%20%20%20%20%20%20%20%20%20controller.modalTransitionStyle%20=%20UIModalTransitionStyleFlipHorizontal;%20%20%20%20%20%20%20%20%20%20%20%20[self.navigationController%20pushViewController:controller%20animated:YES];%20%20%20%20%20%20%20%20%20%20%20%20[controller%20release];%20%20%20%20%20%20%20%20}%20%20%20%20%20%20%20%20%20%20%20%20}}
可以看到接下来就是FFFFSwitchViewController
FFFFSwitchViewController.h文件
#import%20<UIKit/UIKit.h>//这个TransparendValueDelegate干嘛用暂时不清楚@protocol%20TransparendValueDelegate;//首先这个类继承了UITabBarController,且实现了UITabBarControllerDelegate和UINavigationControllerDelegate两个接口@interface%20FFFFSwitchViewController%20:%20UITabBarController<UITabBarControllerDelegate,UINavigationControllerDelegate>%20%20{}-%20(void)makeTabBarHidden:(BOOL)hide;-(void)hiddenTabButton;-(void)displayTabButton;@end
FFFFSwitchViewController.m%20--->%20init构造函数方法
-(id)init%20{%20%20%20%20if(self=%20[super%20init]){%20%20%20%20%20%20%20%20[self%20makeTabBarHidden:YES];%20%20%20%20%20%20%20%20//定义一个能够存放很多controller的数组%20%20%20%20%20%20%20%20NSMutableArray%20*controllers%20=%20[[NSMutableArray%20alloc]%20initWithCapacity:5];%20%20%20%20%20%20%20%20//首页controller%20%20%20%20%20%20%20%20FFHomePageViewController%20*payout=[[FFHomePageViewController%20alloc]init];%20%20%20%20%20%20%20%20payout.title=@"首页";%20%20%20%20%20%20%20%20UINavigationController%20*nav1%20=%20[[UINavigationController%20alloc]initWithRootViewController:payout];%20%20%20%20%20%20%20%20nav1.navigationBar.tintColor%20=[UIColor%20colorWithRed:0.161%20green:0.584%20blue:0.839%20alpha:1];%20%20%20%20%20%20%20%20[nav1%20setNavigationBarHidden:YES%20animated:NO];%20%20%20%20%20%20%20%20%20//设置controller%20%20%20%20%20%20%20%20FFshezhi%20*shouce=[[FFshezhi%20alloc]init];%20%20%20%20%20%20%20%20shouce.title=@"设置";%20%20%20%20%20%20%20%20UINavigationController%20*nav2%20=%20[[UINavigationController%20alloc]initWithRootViewController:shouce];%20%20%20%20%20%20%20%20nav2.navigationBar.tintColor%20=[UIColor%20colorWithRed:0.161%20green:0.584%20blue:0.839%20alpha:1];%20%20%20%20%20%20%20%20[nav2%20setNavigationBarHidden:YES%20animated:NO];%20%20%20%20%20%20%20%20%20//视频controller%20%20%20%20%20%20%20%20FFVideo%20*conver=[[FFVideo%20alloc]init];%20%20%20%20%20%20%20%20conver.title=@"视频";%20%20%20%20%20%20%20%20UINavigationController%20*nav3%20=%20[[UINavigationController%20alloc]initWithRootViewController:conver];%20%20%20%20%20%20%20%20nav3.navigationBar.tintColor%20=[UIColor%20colorWithRed:0.161%20green:0.584%20blue:0.839%20alpha:1];%20%20%20%20%20%20%20%20[nav3%20setNavigationBarHidden:YES%20animated:NO];%20%20%20%20%20%20%20%20//拍照controller%20%20%20%20%20%20%20%20FFCamera%20*shoucang=[[FFCamera%20alloc]init];%20%20%20%20%20%20%20%20shoucang.title=@"拍照";%20%20%20%20%20%20%20%20UINavigationController%20*nav4%20=%20[[UINavigationController%20alloc]initWithRootViewController:shoucang];%20%20%20%20%20%20%20%20nav4.navigationBar.tintColor%20=[UIColor%20colorWithRed:0.161%20green:0.584%20blue:0.839%20alpha:1];%20%20%20%20%20%20%20%20[nav4%20setNavigationBarHidden:YES%20animated:NO];%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nav1.navigationBar.barStyle%20=%20UIBarStyleDefault;%20%20%20%20%20%20%20%20nav2.navigationBar.barStyle%20=%20UIBarStyleDefault;%20%20%20%20%20%20%20%20nav3.navigationBar.barStyle%20=%20UIBarStyleDefault;%20%20%20%20%20%20%20%20nav4.navigationBar.barStyle%20=%20UIBarStyleDefault;%20%20%20%20%20%20%20%20payout.tabBarItem.image%20=%20[UIImage%20imageNamed:@"sysytem"];%20%20%20%20%20%20%20%20nav2.tabBarItem.image%20=%20[UIImage%20imageNamed:@"setting"];%20%20%20%20%20%20%20%20nav3.tabBarItem.image%20=%20[UIImage%20imageNamed:@"camera"];%20%20%20%20%20%20%20%20nav4.tabBarItem.image%20=%20[UIImage%20imageNamed:@"vido"];%20%20%20%20%20%20%20%20[controllers%20addObject:nav1];%20%20%20%20%20%20%20%20%20[controllers%20addObject:nav3];%20%20%20%20%20%20%20%20%20[controllers%20addObject:nav4];%20%20%20%20%20%20%20%20%20[controllers%20addObject:nav2];%20%20%20%20%20%20%20%20//因为本身就是tabcontroller的子类%20%20%20%20%20%20%20%20self.viewControllers%20%20=%20controllers;%20%20%20%20%20%20%20%20self.delegate%20=%20self;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20[payout%20release];%20%20%20%20%20%20%20%20[nav1%20release];%20%20%20%20%20%20%20%20%20%20%20%20[shouce%20release];%20%20%20%20%20%20%20%20[nav2%20release];%20%20%20%20%20%20%20%20[conver%20release];%20%20%20%20%20%20%20%20[nav3%20release];%20%20%20%20%20%20%20%20[shoucang%20release];%20%20%20%20%20%20%20%20[nav4%20release];%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20float%20width=self.view.bounds.size.width/4;%20%20%20%20%20%20%20%20//初始化界面%20%20%20%20%20%20%20%20for%20(int%20i%20=%200;%20i<4;%20i++)%20{%20%20%20%20%20%20%20%20%20%20%20%20//初始化底部的按钮%20%20%20%20%20%20%20%20%20%20%20%20UIButton%20*%20choiceButton=%20[UIButton%20buttonWithType:UIButtonTypeCustom];%20%20%20%20%20%20%20%20%20%20%20%20choiceButton.frame%20=%20CGRectMake(width%20*%20i,%201024-90,%20width,%2090);%20%20%20%20%20%20%20%20%20%20%20%20//tag设置成10111%20%20%20%20%20%20%20%20%20%20%20%20choiceButton.tag%20=%20i+10111;%20%20%20%20%20%20%20%20%20%20%20%20//给按钮添加点击事件%20%20%20%20%20%20%20%20%20%20%20%20//点击事件无非就是点击后改变按钮的背景图片%20%20%20%20%20%20%20%20%20%20%20%20[choiceButton%20addTarget:self%20action:@selector(clickButton:)%20forControlEvents:UIControlEventTouchDown];%20%20%20%20%20%20%20%20%20%20%20%20%20NSString%20*imagename=[NSString%20stringWithFormat:@"IpadTabbar%d",i+1];%20%20%20%20%20%20%20%20%20%20%20%20[choiceButton%20setImage:[UIImage%20imageNamed:imagename]%20forState:UIControlStateNormal];%20%20%20%20%20%20%20%20%20%20%20%20[choiceButton%20setBackgroundColor:[UIColor%20clearColor]];%20%20%20%20%20%20%20%20%20%20%20%20[self.view%20addSubview:choiceButton];%20%20%20%20%20%20%20%20}%20%20%20%20%20%20%20%20//得到当前第一个button的引用%20%20%20%20%20%20%20%20UIButton%20*button=(UIButton%20*)[self.view%20viewWithTag:10111];%20%20%20%20%20%20%20%20//第一个为选中状态,所以给他设置别的背景图片%20%20%20%20%20%20%20%20[button%20setImage:[UIImage%20imageNamed:@"IpadTabbarBack1"]%20forState:UIControlStateNormal];%20%20%20%20%20%20%20%20self.selectedIndex%20=%200;%20%20%20%20}%20%20%20%20return%20self;}
从FFFFSwitchViewController.m中可以看出他是一个类似iPad主菜单界面。它是一个tab页分别容纳了四个controller,分别是FFHomePageViewControlle、FFshezhi、FFCamera、FFVideo。
顾名思义FFHomePageViewControlle应该所有controller当中最中心的一个controller。
进入FFHomePageViewControlle.h
#import%20<UIKit/UIKit.h>#import%20"FFHomeView.h"#import%20"FFFFWebViewController.h"//FFHomePageViewController继承UIViewController,并实现了FFHomeViewControllerDelegate,UITableViewDelegate,//和UITableViewDataSource三个接口。其中FFHomeViewControllerDelegate为自定义接口@interface%20FFHomePageViewController%20:%20UIViewController%20<FFHomeViewControllerDelegate,UITableViewDelegate,UITableViewDataSource>{%20%20%20%20NSMutableArray%20*bookData;}@end
在看FFHomePageViewControlle.m之前先去探究下FFHomeViewControllerDelegate接口
FFHomeView.h文件
#import%20<UIKit/UIKit.h>@class%20FFHomeView;//接口申明@protocol%20FFHomeViewControllerDelegate<NSObject>@required-(void)getPerSonProduct:(FFHomeView%20*)controller;@end@interface%20FFHomeView%20:%20UIView%20{%20%20%20%20NSArray%20*bookArray;%20%20%20%20NSMutableDictionary%20*perDict;%20%20%20%20//这个类包含这个接口%20%20%20%20id<FFHomeViewControllerDelegate>delegate;%20%20%20%20}@property(nonatomic,retain)NSMutableDictionary%20*perDict;@property(nonatomic,retain)NSArray%20*bookArray;//接口变量delegate作为类FFHomeView的属性@property(nonatomic,assign)id<FFHomeViewControllerDelegate>delegate;
@end
FFHomeView.m文件
#import%20"FFHomeView.h"@implementation%20FFHomeView@synthesize%20delegate;@synthesize%20bookArray;@synthesize%20perDict;-%20(id)initWithFrame:(CGRect)frame%20{%20%20%20%20if%20((self%20=%20[super%20initWithFrame:frame]))%20{%20%20%20%20%20%20%20%20self.backgroundColor=[UIColor%20clearColor];%20%20%20%20}%20%20%20%20return%20self;}//%20Only%20override%20drawRect:%20if%20you%20perform%20custom%20drawing.//%20An%20empty%20implementation%20adversely%20affects%20performance%20during%20animation.-%20(void)drawRect:(CGRect)rect%20{%20%20%20%20NSInteger%20i=%200;%20%20%20%20%20%20%20%20NSUInteger%20count%20=%204;%20%20%20%20CGFloat%20width%20=%20self.frame.size.width%20/%20count;%20%20%20%20for%20(NSDictionary%20*dict%20in%20bookArray)%20{%20%20%20%20%20%20%20%20NSString%20*keypic=[dict%20objectForKey:@"image"];%20%20%20%20%20%20%20%20UIImage%20*image=[UIImage%20imageNamed:keypic];%20%20%20%20%20%20%20%20if%20(!image)%20{%20%20%20%20%20%20%20%20%20%20%20%20image%20=%20[UIImage%20imageNamed:@"defaultimage.png"]; } if (image) { CGRect frameImage=CGRectMake(172 *i+70,10, 112, 112); [[UIColor whiteColor]set]; [[UIColor colorWithRed:221/255.0 green:221/255.0 blue:221/255.0 alpha:1]set]; [[UIColor clearColor] set]; [image drawInRect:CGRectInset(frameImage,0,0)]; } [[UIColor colorWithRed:116/255.0 green:109/255.0 blue:88/255.0 alpha:1]set]; NSString *china=[NSString stringWithFormat:@"%@",[dict objectForKey:@"name"]]; [china drawInRect:CGRectMake(172 *i+30,125, width, 30) withFont:[UIFont boldSystemFontOfSize:15]
lineBreakMode:UILineBreakModeTailTruncation alignment:UITextAlignmentCenter]; i++; }}- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { CGPoint pt = [[touches anyObject] locationInView:self]; NSUInteger width = self.bounds.size.width / 4; NSUInteger count = 0; for (NSMutableDictionary * dict in bookArray) { CGRect rect = CGRectMake(width * count++, 0,width, self.bounds.size.height); if (CGRectContainsPoint(rect, pt)) { //NSLog(@"dict %@",dict); perDict=dict; if(delegate && [delegate respondsToSelector:@selector(getPerSonProduct:)]){ [delegate getPerSonProduct:self]; return; } } }}- (void)dealloc { [super dealloc];}@end
看到这里我已经完全晕掉了,完全不知这个是用来干什么的?算了还是回到原来的路去吧,之前我们是看到了FFHomePageViewController.h。FFHomePageViewController.h是实现了FFHomeViewControllerDelegate接口,所以我们才会看到上述两个文件的。那现在我们来看下FFHomePageViewController.m的构造函数吧~
FFHomePageViewController.m ---> init构造函数(从这个构造函数可以发现bookData是用来存储bookMenu.plist加载到内存中的键值对的)
-(id)init { if(self= [super init]){ NSString *contentPath = [NSString stringByAppendDocumentDirectory:@"bookMenu.plist"]; bookData=[[NSMutableArray alloc] initWithContentsOfFile:contentPath]; } return self;}
FFHomePageViewController.m ---> loadView方法
//每次访问UIViewController的view(比如controller.view、self.view)而且view为nil,loadView方法就会被调用。- (void)loadView { [super loadView]; //指定view的背景颜色 self.view.backgroundColor=[UIColor colorWithRed:235/255.0 green:232/255.0 blue:222/255.0 alpha:1]; //Logo图片 UIImageView *upImage=[[UIImageView alloc] initWithFrame:CGRectMake(0,0, 768, 88)]; upImage.tag=51; [upImage setImage:[UIImage imageNamed:@"Ipadup"]]; [self.view addSubview:upImage]; [upImage release]; //TableView放一些菜单图标 UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 88, 768, 830-5) style:UITableViewStylePlain]; [tableView setDelegate:self]; [tableView setDataSource:self]; [tableView setTag:111110]; tableView.separatorStyle=UITableViewCellSeparatorStyleNone; tableView.separatorColor=[UIColor clearColor]; [tableView setBackgroundColor:[UIColor clearColor]]; [self.view addSubview:tableView]; [tableView release]; }
话说FFHomePageViewController.h是实现UITableViewDataSource接口和UITableViewDelegate接口的,又通过[tableView setDelegate:self],[tableView setDataSource:self]语句,表示只要在FFHomePageViewController.m当前类重写那些方法就可以了。
UITableViewDataSource,主要为UITableView提 供显示用的数据(UITableViewCell),指定UITableViewCell支持的编辑操作类型(insert,delete和 reordering),并根据用户的操作进行相应的数据更新操作,如果数据没有更具操作进行正确的更新,可能会导致显示异常,甚至crush。
UITableViewDelegate,主要提供一些可选的方法,用来控制tableView的选择、指定section的头和尾的显示以及协助完成cell的删除和排序等功能。
接下来看下渲染每一个cell的方法
FFHomePageViewController.m ---> - (UITableViewCell *)tableView:(UITableView *)tableView1 cellForRowAtIndexPath:(NSIndexPath *)indexPath
//初始化每一行会调用该方法- (UITableViewCell *)tableView:(UITableView *)tableView1 cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = nil; static NSString *kCellTextField1 = @"Cell"; cell = [tableView1 dequeueReusableCellWithIdentifier:kCellTextField1]; if (cell==nil) { if (indexPath.section==0) { //初始化Image UIImage * bgImage = nil; bgImage = [[UIImage imageNamed:@"shuguiback.png"] stretchableImageWithLeftCapWidth:0 topCapHeight:34]; cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellTextField1] autorelease]; cell.selectionStyle = UITableViewCellSelectionStyleNone; cell.accessoryType=UITableViewCellAccessoryNone; //自定义的FFHomeView类构造函数返回自己本身 FFHomeView *drawFriends=[[FFHomeView alloc]initWithFrame:CGRectMake(0, 0,320, 160)]; [drawFriends setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight]; [drawFriends setTag:1]; //FFHomeView的delegate就是FFHomeViewControllerDelegate //而当前类就是实现FFHomeViewControllerDelegate接口的。就是把FFHomeView中要做的事,交给当前类 [drawFriends setDelegate:self]; [drawFriends setUserInteractionEnabled:YES]; [cell.contentView addSubview:drawFriends]; [drawFriends release]; cell.backgroundView=[[UIImageView alloc]initWithImage:bgImage]; } } //这里还没怎么看的明白 if (indexPath.section==0) { if (bookData) { NSUInteger count = [bookData count]; NSUInteger length = indexPath.row * ROWCALUE_NUMBER + ROWCALUE_NUMBER > count?count - indexPath.row * ROWCALUE_NUMBER:ROWCALUE_NUMBER; NSArray * array = [bookData subarrayWithRange:NSMakeRange(indexPath.row * ROWCALUE_NUMBER , length)]; if (array) { FFHomeView * view1 = (FFHomeView * )[cell.contentView viewWithTag:1]; view1.bookArray=array; //setNeedsDisplay会调用自动调用drawRect方法 [view1 setNeedsDisplay]; } } } return cell;}
看了这个方法后差不多也明白了之前的FFHomeView.m文件做的是什么事情了,按照java的理解方式是这样的。就相当于在FFHomeView类中写了一个事件接口FFHomeViewControllerDelegate,在该类的touchesEnded事件函数中回调FFHomeViewControllerDelegate接口里的getPerSonProduct方法。而getPerSonProduct方法真正的实现而在FFHomePageViewController类当中。
然后调用顺序就是:
当我们触发菜单栏的图标--->调用FFHomeView里的touchesEnded事件--->再调用到FFHomePageViewController里的getPerSonProduct事件
FFHomePageViewController.m ---> getPerSonProduct方法
-(void)getPerSonProduct:(FFHomeView *)controllerRenqi{ //在FFHomeView内部调用该函数的时候把自己本身传入,而自己本身包含perDict键值对 //<dict><key>url</key><string>/index.php/cms/item-hjindex</string></dict> NSString *stringURL=[controllerRenqi.perDict objectForKey:@"url"]; if ([stringURL isEqualToString:@"exit"]) { //若退出,显示登陆界面 FFLrcController *publish = [[FFLrcController alloc]init]; UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:publish]; [self presentModalViewController:nav animated:NO]; //每次使用完controller都释放掉 [publish release]; return; } NSString *createurl=[controllerRenqi.perDict objectForKey:@"createurl"]; //WebViewController FFFFWebViewController * web=[[FFFFWebViewController alloc] init:stringURL createURL:createurl]; NSString *name=[controllerRenqi.perDict objectForKey:@"name"]; web.TT=name; web.hidesBottomBarWhenPushed=YES; [self.navigationController pushViewController:web animated:YES]; [web release]; }
看完上面这些代码后,发现接下来的视图传入的是WebViewController,参数是url。我想这个一定是传说中的app中加个webview。大部分操作可能会由webview来实现。
另外我想你会跟我一样有这样的一些问题,createurl是什么?干什么用?不急不急,接下来来看看FFFFWebViewController 是怎么实现的。
#import <UIKit/UIKit.h>#import "FFFFSwitchViewController.h"//发现这个类是继承UIViewController,并实现了UIWebViewDelegate接口@interface FFFFWebViewController : UIViewController <UIWebViewDelegate>{ //浏览器 UIWebView * webView; //UIActivityIndicatorView实例提供轻型视图,这些视图显示一个标准的旋转进度轮。 UIActivityIndicatorView *activityIndicator; NSString *stringUrl; NSString *createUrl; NSString *TT;}@property(nonatomic,retain)NSString *TT; @property(nonatomic,retain)NSString *stringUrl;@property(nonatomic,retain)NSString *createUrl;-(id)init:(NSString *)string createURL:(NSString*)curl;//-(void)loadWebView:(NSString*)string;@end
FFFFWebViewControlle.h主要就是实现了 UIWebViewDelegate委托接口,UIWebViewDelegate主要有下面几个方法。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; //加载前
//第一个参数为:要显示的地址-(id)init:(NSString *)string createURL:(NSString*)curl{ if(self=[super init]){ self.stringUrl=[[NSString stringWithFormat:@"%@%@", @"http://xxxxx/hjjd", string]
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; self.createUrl = curl; } return self;}
FFFFWebViewController.m ---> loadView方法
- (void)loadView { [super loadView]; self.view.backgroundColor=[UIColor colorWithRed:235/255.0 green:232/255.0 blue:222/255.0 alpha:1]; //存放logo UIImageView *uv=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 768, 60)]; uv.tag=1; [uv setImage:[UIImage imageNamed:@"Ipadnavigation"]]; [self.view addSubview:uv]; [uv release]; //返回按钮 UIButton *check = [UIButton buttonWithType:UIButtonTypeCustom]; check.tag=2; check.frame =CGRectMake(10, 22, 48, 30); [check.titleLabel setFont:[UIFont boldSystemFontOfSize:14]]; [check setTitle:@"返回" forState:UIControlStateNormal]; //点击后出发goBack事件 [check addTarget:self action:@selector(goBack) forControlEvents:UIControlEventTouchDown]; [check setBackgroundImage:[UIImage imageNamed:@"IpadnClose"] forState:UIControlStateNormal]; [self.view addSubview:check]; //新建按钮 if(![self.createUrl isEqualToString:@"null"]){ UIButton *upButton = [UIButton buttonWithType:UIButtonTypeCustom]; upButton.tag=3; upButton.frame =CGRectMake(768-58, 22, 48, 30); [upButton setTitle:@"新建" forState:UIControlStateNormal]; [upButton.titleLabel setFont:[UIFont boldSystemFontOfSize:14]]; //点击后触发resum事件 [upButton addTarget:self action:@selector(resum) forControlEvents:UIControlEventTouchDown]; [upButton setBackgroundImage:[UIImage imageNamed:@"IpadnClose"] forState:UIControlStateNormal]; [self.view addSubview:upButton]; } //标题 UILabel *titleLabel=[[UILabel alloc]initWithFrame:CGRectMake(0,23,768,30)]; titleLabel.tag=4; [titleLabel setFont:[UIFont boldSystemFontOfSize:20]]; [titleLabel setTextAlignment:UITextAlignmentCenter]; titleLabel.lineBreakMode=UILineBreakModeWordWrap; titleLabel.numberOfLines=0; titleLabel.text =TT; [titleLabel setTextColor:[UIColor whiteColor]]; [titleLabel setBackgroundColor:[UIColor clearColor]]; [self.view addSubview:titleLabel]; [titleLabel release]; webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 60, 768, 1024-20-88-88+60)]; webView.scalesPageToFit = YES; //设置delegate为本身,因为该类实现UIWebViewDelegate接口 webView.delegate = self; webView.backgroundColor = [UIColor clearColor]; [self.view addSubview:webView];
activityIndicator = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(0, 15, 50, 50)]; [activityIndicator setCenter:CGPointMake(768/2,1024/2)]; [activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleGray]; [self.view addSubview:activityIndicator]; //加载链接地址 [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.stringUrl]]];}
FFFFWebViewController.m ---> resum事件
-(void)resum{ FFcreateViewContonroller *matchset=[[FFcreateViewContonroller alloc]init:self.createUrl]; matchset.TT=[NSString stringWithFormat:@"新建%@",TT]; [self presentModalViewController:matchset animated:YES]; [matchset release];}
FFFFWebViewController.m ---> goBack事件
- (void)goBack { //假如浏览器可以goBack就先goBack if([webView canGoBack]){ [webView goBack]; }else{ //否则弹出controller [self.navigationController popViewControllerAnimated:YES]; }}
从上面的代码就可以看出createurl是用来做什么的了,假如我们点击右上角的新建按钮,createurl可以让webview转跳到自己定义的页面当中。另外假如自己需要controller之间的转跳,则只要在新建点击后判断createurl的内容,就可以任意转跳到自己的地方了。到这里差不多可以看懂原作者的app设计思路是怎么样的了。这里点击新建后会进入
新闻热点
疑难解答