Presentation is loading. Please wait.

Presentation is loading. Please wait.

第8章 IOS客户端模块实现 倚动实验室.

Similar presentations


Presentation on theme: "第8章 IOS客户端模块实现 倚动实验室."— Presentation transcript:

1 第8章 IOS客户端模块实现 倚动实验室

2 CONTENTS 目录 8.1 App框架的搭建 8.2 我的高考模块实现 8.3 录取线查询模块实现 8.4 推荐学校模块实现

3 在对我们“豹考通”进行了详细的流程和模块设计之后,我们就可以开始编码,实现我们想要实现的功能了。这里我们仅仅对App框架搭建、我的高考、分数线查询和推荐学校几个模块进行详细讲解。
在开始编码之前,我们需要思考使用什么框架去搭建应用,根据对市面上大多数应用的分析以及对“豹考通”的需求分析来看,我们还是使用UITabbarController和UINavigationController去搭建框架,管理视图。 8.1.1创建项目工程及文件 步骤一:创建项目

4 新建项目时所需要填写的相关信息含义如下:
·Product Name:这是应用的名称,最好能具有代表意义,能够简单说明应用的内容,做到顾名思义。 ·Organization Name:机构名称,这个名称会出现在项目每个.h和.m文件中,是用户的一个代号。比如笔者使用的是“Christopher”,那么在.h和.m文件中,就会出现如下字样,说明创建日期和版权归属。 Created by Christopher on 5/5/14. Copyright (c) 2014 Christopher. All rights reserved. ·Organization Identifier:这个是公司标识符,也是用户最需要重视的一个信息,它直接关系到应用最后发布的情况。填写的格式是公司的反域名,即com.companyname。笔者再提一下应用发布,如果应用完成之后,想发布到App Store中,如果填写的公司标识符与新建工程时填写的公司标识符不一致,那么上传就会失败。所以需要读者特别重视。

5 ·Bundle Identifier:Bundle包标识符,它不需要用户自己输入,而是由Company Idenfier加上项目名称组成,前面提到的应用发布时就是需要匹配Bundle Identifier。因为它和Company Identifier有直接的关系,这个部分非常重要。 ·Language:选择用于开发的语言,这里提供了两种IOS开发语言供用户选择,分别是Objective-C和Swift。这里我们选择Objective-C进行开发,Swift是Apple公司最新开发的一门编程语言,它的编码形式更加简单,也更人性化,有兴趣的读者可以自己学习并使用Swift语言进行IOS的开发。 ·Devices:开发设备,就是你的应用面向iPhone开发还是iPad开发,或者二者都是,那么需要用户在这里选择。默认的是iPhone。 ·Use Core Data:Core Data是IOS开发中的一种数据管理机制,这里我们不需要勾选。

6 步骤二:分别创建三个模块的文件夹,并创建根视图
在XCode中新建文件夹

7 8.1.2创建根视图控制器以及3个模块视图控制器 步骤一:创建UIView实例 步骤二:创建3模块实例,并置于根视图控制器中
1. #import <UIKit/UIKit.h> BaseViewController : UITabBarController 3. { UIView *_tabbarView; 5. } 步骤二:创建3模块实例,并置于根视图控制器中

8 8.1.3在根视图Tabbar栏中创建3个模块视图 步骤一:设置模块在Tabbar中的位置 1. - (void)_initTabBar
2. { _tabbarView = [[UIView alloc]initWithFrame:CGRectMake(0, ScreenHeight - 49, 320, 49)]; [self.view addSubview:_tabbarView]; _tabbarView.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0.0 alpha:0.3]; for (int i = 0;i < 3;i++){ UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake( i* , ( )/2, 100, 45); button.tag = i; [button addTarget:self forControlEvents:UIControlEventTouchUpInside]; [_tabbarView addSubview:button]; } 13. }

9 8.1.4在AppDelegate文件中设置根视图
步骤二:添加Tabbar单击事件 1. - (void)selectTab:(UIButton *)button 2. { self.selectedIndex = button.tag; 4. } 8.1.4在AppDelegate文件中设置根视图 1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 2. { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; baseViewCtrl = [[BaseViewController alloc] init]; self.window.rootViewController = baseViewCtrl; [baseViewCtrl release]; return YES; 11. }

10 应用框架界面 我的高考模块运行效果

11 8.2我的高考模块实现 8.2.1在AppDelegate文件中设置根视图 8.2.2创建各信息填写控制器
步骤一:创建UITableView实例 1. #import <UIKit/UIKit.h> myScoreViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> (nonatomic, retain)UITableView *tableView; 步骤二:创建UILabel实例 8.2.2创建各信息填写控制器 步骤一:创建子控制器 步骤二:声明信息填写相关协议,实现界面传值 步骤三:实现其他子视图控制器的传值

12 全国省市plist文件存储 一个plist文件包括3个部分,Key、Type和Value,这里的Key都为State,Type可以是Dictionary(字典)和NSArray(数组),Value为全国各省份地区。

13 8.2.3 UIAlertView协议实现 高考成绩输入框

14 8.2.4 在基视图中显示用户填写信息 NSUserDefaults读取用户选择的信息的方法如下代码所示。
1. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 2. NSString *subjectString = [defaults 3. subjectLabel.text = subjectString; 我的高考模块界面

15 8.2.5 广告栏设置 最后需要完成的就是广告栏的设置。根据需求我们了解到,当用户生源地选择“江西”时,广告显示的内容和其他的生源地不一样,那么我们在视图显示时,首先要判断用户的生源地信息,如果是“江西”则显示第一种广告;如果不是“江西”就显示第二种广告。 我的高考模块(非江西广告)界面 我的高考模块(广告)界面

16 8.3录取线查询模块实现 在录取线查询模块中,我们通过“省控线查询”功能讲解如何使用服务器端接口,并通过使用JSon来解析网络数据。 当用户点击“省控线查询”单元格cell时,会弹出省份的子视图。因为省份信息是固定的,我们可以把它们存放到plist配置文件中,当需要用到时直接调用即可。我们这里采用就是配置文件的方法。plist配置文件采用的是key-value方式。 8.3.1实现选择省市地区功能 读取出plist文件的值将它赋给provinceArray。读取plist文件的方法非常简单,只需指定一个路径,包括文件名和类型(plist),NSBundle mainBundle是用于获取本地路径。 1. NSString *plistPath = [[NSBundle 2. proviceArray = [[NSArray alloc]initWithContentsOfFile:plistPath]; 3. cell.textLabel.text = [[proviceArray

17 8.3.2实现省份选择、分数线查询与界面跳转 步骤一:在.h文件中创建各实例
(nonatomic, retain)NSMutableArray *data; //存储网络数据 (nonatomic, assign)int provinceIndex; //省份索引值 (nonatomic, copy)NSString *yearString; //年份 (nonatomic, assign)int catagory; //科类 (nonatomic, assign)int batch; //批次 (nonatomic, retain)UITableView *tableView; //表视图 (nonatomic, retain)NSArray *yearArray; //年份数组 (nonatomic, retain)NSArray *cataArray; //科类数组 (nonatomic, retain)NSArray *batchArray; //批次数组 (nonatomic, retain)UILabel *yearLabel; //年份标签 (nonatomic, retain)UILabel *catagoryLabel; //科类标签 (nonatomic, retain)UILabel *batchLabel; //批次标签 (nonatomic, retain)UILabel *areaLabel; //生源地标签 (nonatomic, retain)UILabel *lineLabel; //分数线标签

18 步骤二:添加网络库 我们需要访问网络接口,通过HTTP协议读取请求网络数据。那么在请求网络数据之前,我们需要添加一些框架和一些第三方库。 因为要使用HTTP协议,我们需要导入第三方库ASIHTTPRequest,它是一款功能十分强劲的HTTP访问开源项目。 下载地址: 把下载好的文件导入到XCode项目中,然后添加5个库文件: ·CFNetwork ·systemConfiguration ·MoblieCoreServices ·libz ·libxml2

19 步骤三:对查询省控线界面进行布局 步骤四:添加选择省份跳转功能
1. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 2. { LineViewController *line = [[LineViewController alloc]init]; line.provinceIndex = indexPath.row; line.title = [[proviceArray [self.navigationController pushViewController:line animated:YES]; [line release]; 8. } 这里需要注意line.provinceIndex = indexPath.row;这行代码,因为查询省控线需要访问接口,那么就要用到相关的参数,省份索引值就是参数之一。需要的参数在编写代码之前服务器端开发人员会把接口发送给客户端开发人员。还通过line.title = [[proviceArray

20 8.3.3网络接口读取(远程服务器) 1. NSURL *url = [NSURL URLWithString:[NSString 2. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 3. [request 4. [request startSynchronous]; 5. NSData *netData = request.responseData; 6. NSString *jsonString = [[NSString alloc]initWithData:netData encoding:NSUTF8StringEncoding]; 7. SBJsonParser *parser = [[SBJsonParser alloc] init]; 8. data = [parser objectWithString:jsonString]; 上述实现了访问网络数据,对最后服务器返回的结果显示。并设置了UIPickerView滑动实现的方法,对于不同的滑动位置,有不同的数据实现,这里需要读者自己每项进行设置。构架并运行模拟器,可以发现访问网络接口返回的数据如下所示。

21 解析的方法如下代码所示。 网络数据形式如下:
1. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url2]; 2. [request 3. [request startSynchronous]; 4. NSData *netData = request.responseData; 5. NSString *jsonString = [[NSString alloc]initWithData:netData encoding:NSUTF8StringEncoding]; 6. SBJsonParser *parser = [[SBJsonParser alloc] init]; 7. data = [parser objectWithString:jsonString]; 网络数据形式如下: data:( { "area_name" = "\U6c5f\U897f"; "batch_name" = "\U4e00\U672c"; "category_name" = "\U6587\U53f2"; id = 1182; line = 532; yaerTime = 2011; }, "batch_name" = "\U4e8c\U672c"; id = 1172; line = 484;

22 8.3.4网络接口读取(本地服务器) 若有些环境不能够进行远程服务器的连接与访问,我们还可以通过本地服务器请求数据。在服务器端中我们讲到了服务器与客户端交互接口的实现,用户可以使用本地PC机作为服务器,也可以直接使用我们的服务器作为数据接口。若用户使用本地服务器,在上述的代码中的URL就需要使用本地PC机的的IP地址,如下URL所示。 将接口的地址改为如下代码: 1. NSURL *url = [NSURL URLWithString:[NSString 2. NSURL *netUrl = [NSURL 3. ConnectNetWork *connect = [[ConnectNetWork alloc]init];

23 8.3.5基视图信息显示实现 主界面一共有两个功能,省控线查询和高校录取线查询,这里我们实现的是省控线查询模块。searchViewController主界面如下图所示。

24 步骤一:定义UITableView与省份NSArray实例
1. #import <UIKit/UIKit.h> searchScoreViewController : UIViewController<UITableViewDelegate,UITableViewDataSource> (nonatomic, retain)UITableView *tableView; (nonatomic, retain)NSArray *proviceArray; 步骤二:创建并初始化UITableView实例,实现UITableView协议方法 1. static NSString *identifier UITableViewCell *cell = nil; if (cell == nil){ cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; } if (indexPath.row == 0) { cell.textLabel.text cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; }else{ cell.textLabel.text cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } cell.selectedBackgroundView = [[[UIView alloc] initWithFrame:cell.frame] autorelease]; cell.selectedBackgroundView.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.3]; return cell;

25 步骤三:实现单击cell选择查询功能 1. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 2. { if (indexPath.row == 0) { provinceViewController *provice = [[provinceViewController alloc]init]; [self.navigationController pushViewController:provice animated:YES]; [provice release]; }else{ schoolScoreViewController *schoolScore = [[schoolScoreViewController alloc]init]; [self.navigationController pushViewController:schoolScore animated:YES]; [schoolScore release]; } 12. }

26 两个查询分数的选择,当单击第一个cell,则跳转省控线查询;若单击第二个cell,跳转到高校往年录取分查询。
构建并运行,最后的效果如下图所示。

27 8.4推荐学校模块实现 在本节中,我们将综合前面几个小节的知识,完整的展示“推荐学校”模块的实现过程。因为模块中各个控件的位置相对固定,不需要动态的变化,所以这里我们就采用Xib方法进行视图的布局。布局情况如下图所示。

28 8.4.1创建推荐学校视图控制器与XIB文件

29 8.4.2创建推荐学校模块实例并进行界面布局 创建recommendViewController类,在推荐学校功能中,需要用户选择学校,所以还需选择省份proViewController类和选择学校SchoolInfoViewController类。在recommendViewController.h文件中,将两个子类的头文件导入,同时将Xib文件中的控件与.h文件链接起来,创建关联(插座)。

30 步骤一:创建参数与控件实例 1. @interface recommendViewController : UIViewController
2. <UITableViewDataSource,UITableViewDelegate> 3. { int cata; //科类 int batch; //批次 int order; //推荐方式 7. } (nonatomic, retain)NSMutableArray *data; //存储网络数据数组 (retain, nonatomic) IBOutlet UISegmentedControl *batchSeg; //批次选择控件 (retain, nonatomic) IBOutlet UISegmentedControl *orderSeg; //方式选择控件 (retain, nonatomic) IBOutlet UILabel *areaLabel; //生源地标签 (retain, nonatomic) IBOutlet UILabel *provinceLabel; //省市标签 (nonatomic, retain)NSArray *proviceIdArray; //省份ID数组 (retain, nonatomic) IBOutlet UILabel *categoryLabel; //科类标签 (retain, nonatomic) IBOutlet UILabel *scoreLabel; //分数标签 (retain, nonatomic) UITableView *tableView; //表视图 (retain ,nonatomic) UIView *titleView; //信息头视图 18. - (IBAction)choosePro:(id)sender; //选择省市按钮

31 8.4.3省份选择功能实现 步骤二:添加UISegmentedControl控件方法,并读取个人信息 步骤三:对信息视图以及表视图进行布局
步骤一:创建实例及协议 在proViewController.h文件中,我们初始化一个表视图和一个数组用于存储省市信息,还需要声明一个协议代理方法用于视图控制器之间的传值。 1. #import <UIKit/UIKit.h> 2. //地区标签值改变协议 proPickViewControllerDelegate <NSObject> 5. - (void)changeProLabelText:(NSString *)text; proViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> (nonatomic, retain)UITableView *tableView; (nonatomic, retain)NSArray *proviceArray; (nonatomic, assign)id <proPickViewControllerDelegate>proDelegate;

32 需要注意的是需要设置proViewController实例的代理。协议代理方法实现如下。
步骤二:实现省份选择功能 1. - (IBAction)choosePro:(id)sender 2. { proViewController *pro = [[proViewController alloc]init]; pro.proDelegate = self; UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:pro]; [self.navigationController presentViewController:navi animated:YES completion:NULL]; [navi release]; 8. } 需要注意的是需要设置proViewController实例的代理。协议代理方法实现如下。 1. #pragma mark - proPickViewControllerDelegate 2. -(void)changeProLabelText:(NSString *)text 3. { _provinceLabel.text = text; 5. }

33 步骤三:对省份选择UITableView表视图布局,并实现协议方法
1. [super viewDidLoad]; _tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, ScreenHeight) style:UITableViewStylePlain]; _tableView.dataSource = self; _tableView.delegate = self; [self.view addSubview:_tableView]; //自定义取消按钮 UIButton *cancel = [UIButton buttonWithType:UIButtonTypeRoundedRect]; cancel.frame = CGRectMake(0, 0, 40, 20); [cancel forState:UIControlStateNormal]; [cancel setShowsTouchWhenHighlighted:YES]; [cancel addTarget:self forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *barButton = [[UIBarButtonItem alloc]initWithCustomView:cancel]; [cancel release]; self.navigationItem.leftBarButtonItem = barButton; [barButton release]; //读取plist文件,读取省市信息 NSString *plistPath = [[NSBundle _proviceArray = [[NSArray alloc]initWithContentsOfFile:plistPath];

34 8.4.4网络接口读取(远程服务器) 8.4.5网络接口读取(本地服务器)
步骤四:实现推荐学校视图控制器信息读取和UISegmentedControl控件选择方法 因为个人的信息会根据用户的修改而改变,所以我们在viewDidAppear方法中重新读取了一次本地NSUserDefaults文件,这样每次视图显示时都能显示最新的个人信息。 8.4.4网络接口读取(远程服务器) 8.4.5网络接口读取(本地服务器) 与录取线查询模块类似,若使用本地服务器,在访问网络时的URL就需要使用本地PC机的的IP地址,如下URL所示。 " 这个是我们推荐学校模块的服务器接口URL,本地服务器把“ 将接口的地址改为如下代码: 1. NSURL *url = [NSURL URLWithString:[NSString 2. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 3. [request 4. [request startSynchronous];

35 如小组1使用本地服务器1,ip地址为192. 168. 1. 101,那么url为此ip地址;若小组2使用本地服务器2,ip地址为192
如小组1使用本地服务器1,ip地址为 ,那么url为此ip地址;若小组2使用本地服务器2,ip地址为 ,那么url改为此ip地址,这就是分组访问不同本地服务器的方法。 最后返回的结果与远程服务器请求结果一致。访问局域网,读取数据成功界面如下图所示。若连接服务器失败,则推荐无结果,表视图为空。

36 8.4.6显示推荐结果 课后练习 1、修改App整体框架,增加“投档线预测”与“关于我们”模块,加入到Tabbar中。
2、对“投档线预测”模块进行实现,该模块需要的参数有批次、生源地、科类、学校和今年省控线,可以调用服务器接口: 3、本章8.2小结“我的高考”模块,使用的是NSUserDefaults方法存储用户信息,将信息保存在本地文件中,现要求读者使用Plist属性列表或者文件的方法将用户的基本信息保存起来。 4、比较NSUserDefaults、list属性列表和文件三种存储方法的优缺点,并各举一例进行详细说明。 5、按照本章8.4小节的内容,已经实现的功能是推荐学校,但并不能显示该学校详细的专业情况,请读者接着完成单击推荐结果表视图,显示该学校具体专业信息的功能。(提示:在使用UINavigationController的PushViewController方法时,将学校的ID传给学校专业信息视图控制器,再次读取网络接口,用于显示)

37


Download ppt "第8章 IOS客户端模块实现 倚动实验室."

Similar presentations


Ads by Google