IOS项目练习 之 "找驾校"

这是最近的一个作业练习,因为一直不知道这个博客写什么内容,就拿这个作业来展示一下,顺便分享一下我在这个项目中使用到的一些小技巧;

项目的源代码可以在我的gitHub上获得,项目地址为:https://github.com/vfanx/ZhaoJiaXiao

项目展示:

  

  

  

功能介绍:

1.练习模块:能即时判断答案正误,并且给出问题解析

2.考试模块:能通过设置模块设置考题数目,并且给出考试结果

3.错题模块:能够保存考试模块中的错题并且给出答案解析,错误答案以及正确答案

4.考试成绩:统计每次考试的时间和成绩

5.设置模块:即时的设置考试模块的考题数目

技巧分析:

1. 无论是那个模块都是基于数据库的数据,虽然取自与不同的表,但是数据之间还是由一定的相似性,所以我为定义了一个抽象基类的model;

所有的viewcontroller无论是否有tableview都拥有一个数据源,而且数据源的数据读取方式相似,所以我设计了一个遵守UITableViewDataSource协议的类来为所有viewcontroller提供数据,并且对其进行一定的抽象和提供一定数量的接口来保证其复用性;这里贴出datasource的代码,

 1 #import <UIKit/UIKit.h>
 2
 3 @class DataModel;
 4 typedef void(^ConfigureCell)(id item,id cell);
 5
 6
 7 @protocol DataSource <NSObject>
 8
 9 @optional
10 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;
11
12 @end
13
14
15 @interface DataSource : NSObject<UITableViewDataSource>
16
17
18 @property (nonatomic,assign) BOOL tableCanEdit;
19 @property (nonatomic,weak) id<DataSource> delegate;
20 @property (nonatomic,strong) NSArray *indexArry;
21 @property (nonatomic,strong) NSMutableDictionary *itemDict;
22
23 - (instancetype)initWithTableName:(NSString *)tableName indexArry:(NSArray *)arry configureBlock:(ConfigureCell)block;
24
25 - (DataModel *)findDataModelWithIndex:(NSInteger)index;
26 - (DataModel *)findDataModelWithIndexPath:(NSIndexPath *)indexPath;
27
28
29 @end

DataSource.h

 1 #import "DataSource.h"
 2 #import "DataModel.h"
 3 #import "DataModelBuilder.h"
 4
 5
 6 @interface DataSource ()
 7
 8 @property (nonatomic,copy) NSString *tableName;
 9 @property (nonatomic,copy) ConfigureCell configureBlock;
10
11 @end
12
13 @implementation DataSource
14
15 - (instancetype)initWithTableName:(NSString *)tableName indexArry:(NSArray *)arry configureBlock:(ConfigureCell)block
16 {
17     self = [super init];
18     if (self) {
19         _tableName = tableName;
20         _indexArry = arry;
21         _itemDict = [[NSMutableDictionary alloc] init];
22         _configureBlock = [block copy];
23         _tableCanEdit = NO;
24     }
25
26     return self;
27 }
28 - (DataModel *)findDataModelWithIndex:(NSInteger)index
29 {
30     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
31     DataModel *model = [_itemDict objectForKey:indexPath];
32     if (model == nil) {
33         model = [DataModelBuilder buildDataModelWithTableName:_tableName serialNumber:_indexArry[index]];
34     }
35     return model;
36 }
37
38 - (DataModel *)findDataModelWithIndexPath:(NSIndexPath *)indexPath
39 {
40     DataModel *model = [_itemDict objectForKey:indexPath];
41     if (model == nil) {
42         model = [DataModelBuilder buildDataModelWithTableName:_tableName serialNumber:_indexArry[indexPath.row]];
43     }
44     return model;
45 }
46
47 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
48 {
49     return _indexArry.count;
50 }
51
52
53 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
54 {
55     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:_tableName forIndexPath:indexPath];
56     cell.textLabel.font = [UIFont systemFontOfSize:13];
57     cell.textLabel.numberOfLines = 0;
58     DataModel *model = [self findDataModelWithIndexPath:indexPath];
59     _configureBlock(model,cell);
60     return cell;
61 }
62
63 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
64 {
65     return _tableCanEdit;
66 }
67
68 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
69 {
70     if (editingStyle == UITableViewCellEditingStyleDelete) {
71         [_delegate tableView:tableView commitEditingStyle:editingStyle forRowAtIndexPath:indexPath];
72     }
73 }
74
75
76 @end

DataSource.m

2.一个神奇的自定义控件:

由于要修改考题的数量,没有适合的控件,然后我就对UISegmentedControl进行了一个不友好的封装,定义一个UISegmentedControl,设置三个分段

分别为"-","(当前数目)","+",然后通过左右两边老控制中间标题的数字,具体代码如下;

 1 #import <UIKit/UIKit.h>
 2
 3 @interface NumberSegmentedControl : UISegmentedControl
 4
 5 @property (assign,nonatomic) NSInteger numValue;
 6 @property (assign,nonatomic) BOOL isCongfigure;
 7
 8 - (void)configureNumberSegmented;
 9
10 @end

NumberSegmentedControl.h

 1 #import "NumberSegmentedControl.h"
 2
 3 @implementation NumberSegmentedControl
 4
 5 - (void)configureNumberSegmented
 6 {
 7     if (_isCongfigure) {
 8         return;
 9     }
10     _numValue = [[NSUserDefaults standardUserDefaults] integerForKey:@"numValue"];
11     NSString *temp = [NSString stringWithFormat:@"%ld",(long)_numValue];
12     NSInteger count = self.numberOfSegments;
13     for (NSInteger i = 0; i < count; i ++) {
14         [self removeSegmentAtIndex:0 animated:NO];
15     }
16     [self insertSegmentWithTitle:@"-" atIndex:0 animated:NO];
17     [self insertSegmentWithTitle:temp atIndex:1 animated:NO];
18     [self insertSegmentWithTitle:@"+" atIndex:2 animated:NO];
19     [self addTarget:self action:@selector(segmentValueChange:) forControlEvents:UIControlEventValueChanged];
20     self.tintColor = [UIColor grayColor];
21     _isCongfigure = YES;
22     self.selectedSegmentIndex = 1;
23 }
24
25 - (void)segmentValueChange:(id)sender
26 {
27     if (self.selectedSegmentIndex == 1) {
28         return;
29     }
30     if (self.selectedSegmentIndex == 0 && _numValue > 0) {
31         self.numValue = _numValue-1;
32     }else if (self.selectedSegmentIndex == 2)
33     {
34         self.numValue = _numValue+1;
35     }
36     NSString *tittle = [NSString stringWithFormat:@"%ld",(long)_numValue];
37     [self setTitle:tittle forSegmentAtIndex:1];
38     self.selectedSegmentIndex = 1;
39 }
40
41 - (void)setNumValue:(NSInteger)numValue
42 {
43     _numValue = numValue;
44     [[NSUserDefaults standardUserDefaults] setInteger:numValue forKey:@"numValue"];
45 }
46
47
48 @end

NumberSegmentedControl.m

写在最后的话:

第一次写技术博客不知道写什么,如果有幸这篇博文被看到的话,希望你可以顺便去下载github下载我的代码试试,应该比这篇博文写得好;

写代码时间不长,代码风格还在形成当中,逻辑上可能也有些问题,如有错误,欢迎指正,谢谢阅读.

时间: 2024-11-14 12:04:43

IOS项目练习 之 "找驾校"的相关文章

Xamarin iOS项目找不到模拟器

Xamarin iOS项目找不到模拟器 在Visual Studio中,突然找不到模拟器,并且项目提示试用期过期:Trial period has expired.出现这种情况,是由于苹果系统中Xamarin所使用的账号已经过试用期.这个时候,只需要退出登录的账号,就可以继续使用了.

iOS项目开发之Socket编程

有一段时间没有认真总结和写博客了 前段时间找工作.进入工作阶段.比较少静下来认真总结,现在静下心来总结一下最近的一些心得 前言 AsyncSocket介绍 AsyncSocket详解 AsyncSocket示例 一.前言 公司的项目用到了Socket编程,之前在学习的过程当中,用到的更多的还是http请求的方式.但是既然用到了就必须学习一下,所以就在网上找一些例子,然后想自己写一个demo.可是发现很多写iOS Socket的博客并没有很详细的说明,也可能是大神们觉得其他东西都浅显易懂. 自己专

Swift开发iOS项目实战视频教程(一)---iOS真简单

本课主要介绍iOS项目的创建.第一个iOS项目的开发.UILabel.UIButton的使用. 假设你看完此视频还认为iOS非常难,请你来找我! 本教程摒弃枯燥的语法和知识解说,全是有趣有料的项目实战! 视频链接:v.youku.com/v_show/id_XNzI4NDQzNDIw.html 高清视频下载:pan.baidu.com/s/1ntHl79B 代码下载:pan.baidu.com/s/1bn3sKsZ swift交流群:307561190

ios项目里扒出来的json文件

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #d12f1b } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px "PingFang SC"; color: #d12f1b } p.p4 {

iOS项目中使用CocoaPods问题解决方案

文/yehot(简书作者)原文链接:http://www.jianshu.com/p/a2007d8e2607著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 为什么iOS项目中应该使用CocoaPods作为第三方依赖管理工具?因为: (全文完) 开个玩笑.真正的原因是这样: 目录: 从一个bug说起 分析需求及解决方案 确定方案 CocoaPods学习资料 一.从一个bug说起: 1.公司的项目里统一使用SVG格式的图片:2.GitHub上只有一个star数超过一千的SVG解析库

iOS 项目导入js文件

一.iOS项目中导入js文件 一般情况下把js文件添加到项目中通常会直接copy到项目中(拖拽),这里的js文件可能只有一个层级(一个文件夹包含所有的js文件),也有可能分很多文件夹,将js文件导入项目的时候可以直接拖拽到项目中文件夹,项目会提示文件copy,如下图1-1所示.这里需要选择Create folder references 这样文件夹显示蓝色,如图1-2所示.如果选择Create groups创建,在项目运行的时候编译js文件,如果js文件只在同一个文件夹内运行是成功的,但是如果是

iOS项目中常用的第三方开源库

1.项目使用的第三方开源库 http://github.ibireme.com/github/list/ios/整理了比较常用的iOS第三方组件,以及github上的统计. 项目使用了CocoaPods(类似java中的maven)管理常用的第三方库,一些特殊的单独引用,下面介绍下比较好用的几个. (1)AFNetworking 目前比较推荐的iOS网络请求组件,默认网络请求是异步,通过block回调的方式对返回数据进行处理. 需要注意的是AFNetworking对服务器返回的ContentTy

iOS项目生成通用Windows应用

WinObjc - 使用iOS项目生成通用Windows应用 Github上一周年的WinObjc项目最近发布了预览版本,终于等到了这一天.WinObjc项目就是Build 2015大会上微软宣布的Project IslandWood项目,致力于将iOS应用快速移植成UWP应用.废话不多说,让我们来看看WinObjc项目到底如何使用. 开始之前 开始转制iOS项目前我们要先部署好WinObjc工具,工具链如下: 一台安装了Visual Studio的Windows 10 PC,2015社区版可以

关于目前自己iOS项目使用的第三方开源库

1.AFNetworking 目前比较推荐的iOS网络请求组件,默认网络请求是异步,通过block回调的方式对返回数据进行处理. 2.FMDB 对sqlite数据库操作进行了封装,demo也比较简单. 3.MBProgressHUD 也是iOS项目常用的一个组件,用于显示过渡效果的,比如网络请求之前显示loading,网络结束隐藏loading.建议封装在BaseViewController中,所有ViewController继承就能使用. 4.MJRefresh 这个是传智播客李明杰老师的作品