首页 > 学院 > 开发设计 > 正文

IOS项目-处女作

2019-11-14 19:12:39
字体:
来源:转载
供稿:网友

我最近一直都有在看关于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是什么呢?

NSUserDefaults%20standardUserDefaults用来记录一下永久保留的数据非常方便,不需要读写文件,而是保留到一个NSDictionary字典里,由系统保存到文件里,系统会保存到该应用下的/Library/PReferences/gongcheng.plist文件中。需要注意的是如果程序意外退出,NSUserDefaultsstandardUserDefaults数据不会被系统写入到该文件,不过可以使用[[NSUserDefaultsstandardUserDefaults] synchronize]命令直接同步到文件里,来避免数据的丢失。

接下来我们来看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}}

 

可以看到接下来就是FFFFSwitchViewControllerFFFFSwitchViewController.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; //加载前

- (void)webViewDidStartLoad:(UIWebView *)webView;//开始发送请求(加载数据)时调用这个方法
- (void)webViewDidFinishLoad:(UIWebView *)webView;//请求完毕(加载数据完毕)时调⽤这个方法
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;//请求错误时调用这个方法
 
FFFFWebViewController.m ---> init构造函数方法
//第一个参数为:要显示的地址-(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设计思路是怎么样的了。这里点击新建后会进入
FFcreateViewContonroller。FFcreateViewContonroller其实与FFFFWebViewController非常的相似,也就是嵌入一个webview。

源代码已经分析的差不多了,稍微的总结那么一下。
这个项目的顺序是这样的:AppDelegate_iPad--->FFADSViewController--->FFLrcController
--->FFFFSwitchViewControoler(FFHomePageViewController,FFCamera,FFVideo,FFshezhi)
由FFHomePageViewController出发:FFHomePageViewController--->FFFFWebViewController--->FFcreateViewContonroller

假如要添加某个新功能的话,就可以新建一个controller,然后在resum方法中添加一个判断引导到新建controller就可以了。若需要在新建的controller下面再进入新的controller其实也无妨,popViewController后FFFFWebViewController始终还会在那边的。若新建按钮需要对webview中的内容进行重定向,那就更简单了,直接在resum方法中调用webview的loadRequest方法,填入需要转跳的url就可以了。
到这里文章已经写完了,写的不好希望大家指出!谢谢大家观看~
 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表