Dota2App--第三天

一、要实现的功能

1、新特性页面

1.1、是否进入新特性界面的两种情况

1)第一次安装此APP,进入新特性界面

2)不是第一次安装,但是有版本更新,进入新特性界面

1.2、具体的代码实现

 1      //0.版本号的key
 2         NSString * key = @"CFBundleVersion";
 3
 4         //1.取出沙盒中存储的上次使用软件的版本号
 5         NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
 6         NSString *lastVersion = [defaults stringForKey:key];
 7
 8         //2. 获得当前软件的版本号
 9         NSString *currentVersion = [NSBundle mainBundle].infoDictionary[key];
10         //3.判读版本号
11         if ([currentVersion isEqualToString:lastVersion]) {//如果当前版本和沙盒中的版本一样,则不进入新特性界面
12             self.window.rootViewController = [[FZHTabViewController alloc]init];
13         } else { // 如果不一样,则进入新特性界面
14             self.window.rootViewController = fzhNFVC;
15             // 更新当前版本到沙盒一遍下次使用
16             [defaults setObject:currentVersion forKey:key];
17             [defaults synchronize];
18         }

2、登录注册页面

2.1、登录界面的手机号判断

1)现在的APP大部分都会使用到手机号注册这一功能,有了这个功能就会有判断手机号有效性这一需求,如果我们不判断手机号的有效性的话既会降低用户体验又会丧失掉有用的用户信息。

2)实现思路:创建一个字符串的分类来判断。

2.1.1、具体代码实现

 1 + (BOOL)validatePhone:(NSString *)phone
 2 {
 3     /**
 4      * 手机号码
 5      * 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
 6      * 联通:130,131,132,152,155,156,185,186
 7      * 电信:133,1349,153,180,189
 8      */
 9     NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
10     /**
11      10         * 中国移动:China Mobile
12      11         * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
13      12         */
14     NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
15     /**
16      15         * 中国联通:China Unicom
17      16         * 130,131,132,152,155,156,185,186
18      17         */
19     NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
20     /**
21      20         * 中国电信:China Telecom
22      21         * 133,1349,153,180,189
23      22         */
24     NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
25     /**
26      25         * 大陆地区固话及小灵通
27      26         * 区号:010,020,021,022,023,024,025,027,028,029
28      27         * 号码:七位或八位
29      28         */
30     // NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";
31
32     NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
33     NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
34     NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
35     NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
36
37     if (([regextestmobile evaluateWithObject:phone] == YES)
38         || ([regextestcm evaluateWithObject:phone] == YES)
39         || ([regextestct evaluateWithObject:phone] == YES)
40         || ([regextestcu evaluateWithObject:phone] == YES))
41     {
42         return YES;
43     }
44     else
45     {
46         return NO;
47     }

2.2、密码字符位数的限制

1)实现思路:如果大于6位,则在textfiled的代理方法里面截取字符串的前六位赋值给该textfiled,如果小于六位提示密码位数不符。

2.2.1、具体代码实现

1)大于6位

 1 #pragma mark - #pragma mark- UITextFieldDelegate
 2 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
 3 {
 4     range.location = 0;
 5     range.length = 5;
 6
 7     if (textField.text.length > 5) {
 8         NSString * subString = [self.password.text substringWithRange:range];
 9         self.password.text = subString;
10     }
11     return YES;
12 }

2)小于6位则弹出提示框

1 [MBProgressHUD showError:@"手机号码不正确或密码位数不对"];

2.3、设置键盘类型

1)因为是手机号注册,所以当用户点击textfiled的时候键盘弹出的格式应该是数字键盘,这样就省去了用户改变键盘类型的操作,提高了用户体验。

2.3.1实现代码

1 self.account.keyboardType = UIKeyboardTypeNumberPad;

2.4、本地用户信息的存储

1)数据持久化存储一共有四种方法:归档、plist、SQLite、CoreData。

2)我采用的是归档的方法归档,因为可以存储自己定义的数据类型而且比较简单。

2.4.1、实现思路

1)创建自己的用户模型

2)将数据以模型的方式存储在沙盒中

2.4.2、具体的代码实现

1)数据模型的.h文件

1 //账号密码
2 @property (nonatomic,strong)NSString * user_account;
3 @property (nonatomic,strong)NSString * user_password;
4
5 +(instancetype)accountWithDict:(NSDictionary *)dict;
6 -(instancetype)initWithDict:(NSDictionary  *)dict;

2)数据模型的.m文件

 1 +(instancetype)accountWithDict:(NSDictionary *)dict
 2 {
 3     return [[self alloc]initWithDict:dict];
 4 }
 5 -(instancetype)initWithDict:(NSDictionary *)dict
 6 {
 7     if (self = [super init]) {
 8         [self setValuesForKeysWithDictionary:dict];
 9     }
10     return self;
11 }
12 /**
13  *  从文件中解析对象的时候调
14  */
15 - (id)initWithCoder:(NSCoder *)decoder
16 {
17     if (self = [super init]) {
18         self.user_account = [decoder decodeObjectForKey:@"user_account"];
19         self.user_password = [decoder decodeObjectForKey:@"user_password"];
20     }
21     return self;
22 }
23
24 /**
25  *  将对象写入文件的时候调用
26  */
27 - (void)encodeWithCoder:(NSCoder *)encoder
28 {
29     [encoder encodeObject:self.user_account forKey:@"user_account"];
30     [encoder encodeObject:self.user_password forKey:@"user_password"];
31 }

3)存储模型的代码

1                 //1.存储用户信息
2                 NSString * filepath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"account.data"];
3                 NSMutableDictionary * dict = [NSMutableDictionary dictionary];
4
5                 dict[@"user_account"] = self.account.text;
6                 dict[@"user_password"] = self.password.text;
7                 FZHAccountModel * account = [[FZHAccountModel alloc]initWithDict:dict];
8                 [NSKeyedArchiver archiveRootObject:account toFile:filepath];

4)调取模型数据的代码

1 NSString * filepath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"account.data"];
2     FZHAccountModel *account = [NSKeyedUnarchiver unarchiveObjectWithFile:filepath];

2.5、界面间反向传值

2.5.1、需求分析

当用户在注册界面或者登陆界面输入完信息之后当跳转到上一页面时,应该讲用户账号传递过来,不用用户再次输入账号,以此来提高用户体验。

2.5.2、实现思路

1)代理-协议,自己写一个协议来传递信息

2)block传值

2.5.3、具体代码实现(block),详细讲解:http://www.cnblogs.com/fengzhihao/p/5200527.html

1)定义block

@property (nonatomic,copy)void (^phoneBlock)(NSString * phoneNumber);

2)实现block

//block反向传值
                    if (self.phoneBlock) {
                        self.phoneBlock(self.account.text);
                    }

3)调用block

  FZHLoginViewController * loginVC = [[FZHLoginViewController alloc]init];
    loginVC.phoneBlock = ^ (NSString * phoneNumber){
        NSLog(@"%@",phoneNumber);
        [self.toLoginBtn setTitle:phoneNumber forState:UIControlStateNormal];

    };

二、总结

1、键盘类型具体样式

UIKeyboardTypeDefault:

UIKeyboardTypeASCIICapable:

UIKeyboardTypeNumbersAndPunctuation:

UIKeyboardTypeURL:

UIKeyboardTypeNumberPad:

UIKeyboardTypePhonePad:

UIKeyboardTypeNamePhonePad:

UIKeyboardTypeEmailAddress:

UIKeyboardTypeDecimalPad:

UIKeyboardTypeTwitter:

UIKeyboardTypeWebSearch:

UIKeyboardTypeAlphabet:

三、参考博客

1、键盘类型:http://blog.csdn.net/crazyzhang1990/article/details/39965931

四、demo下载地址

https://github.com/fengzhihao123/FZHDota2

时间: 2024-11-05 16:04:38

Dota2App--第三天的相关文章

angularJs中关于ng-class的三种使用方式说明

在开发中我们通常会遇到一种需求:一个元素在不同的状态需要展现不同的样子. 而在这所谓的样子当然就是改变其css的属性,而实现能动态的改变其属性值,必然只能是更换其class属性 这里有三种方法: 第一种:通过数据的双向绑定(不推荐) 第二种:通过对象数组 第三种:通过key/value 下面简单说下这三种: 第一种:通过数据的双向绑定 实现方式: function changeClass(){   $scope.className = "change2"; } <div clas

三百六十度全景图如何拍摄?

三百六十度全景图如何拍摄?随着全景技术的发展,全景拍摄也成为了一种十分新潮的摄影方式.全景摄影也有很多学问,而且随着全景照片的用途越来越多,拍摄全景的设备也越来越多.今天我们就介绍几种十分另类的360全景图拍摄方法,这些酷雷曼360全景图拍摄方法让你大开眼界. 工具/原料 相机 鱼眼镜头 云台 三角支架 方法/步骤 1 吊锤辅助360全景图拍摄方法 吊线保证拍摄时相机以节点旋转,使用吊线进行全景拍摄线不要太长,50CM以内比较容易控制,有时也到一米多在胸口位置进行拍摄,重锤容易晃动,很难对准.吊

关于SVM数学细节逻辑的个人理解(三) :SMO算法理解

第三部分:SMO算法的个人理解 接下来的这部分我觉得是最难理解的?而且计算也是最难得,就是SMO算法. SMO算法就是帮助我们求解: s.t.   这个优化问题的. 虽然这个优化问题只剩下了α这一个变量,但是别忘了α是一个向量,有m个αi等着我们去优化,所以还是很麻烦,所以大神提出了SMO算法来解决这个优化问题. 关于SMO最好的资料还是论文<Sequential Minimal Optimization A Fast Algorithm for Training Support Vector

三件软件作品评价

先交代三件软件作品的相关资料.   软件一 软件二 软件三 软件名称 蜗牛词典APP 24点小游戏APP 物理实验网站 学校 2017集美大学1412软工实践  集美大学1411 北京航天航空大学计算机学院 团队名称 SNS1412 hexagon 软剑攻城队 团队博客地址 http://www.cnblogs.com/jmu-sns/ http://www.cnblogs.com/24app/ http://www.cnblogs.com/buaase/ Git地址 https://codin

MVC4 自定义错误页面(三)

一.概述 MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面: 二.使用步骤: 1.配置WebConfig文件,在System.Web节点下加上 <customErrors mode="On"  defaultRedirect="~/Shared/Error" /> 翻阅一些大神写的博客,在他们的博客中指出defaultRedirect是指向错误页面的URL,可是经过本人测试的时候,发现

Django(三) ORM 数据库操作

比较有用 转自 http://blog.csdn.net/fgf00/article/details/53678205 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段类型 1.字段类型介绍 2.字段参数介绍 3.Django ORM 外键操作 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 ORM:关系对象映射.定义一个类自动生成数

微信 小程序布局 左右三区块

/* 3三区块部分 *************/ .wear-diamonds{ display: flex; width: 100%; height: 300rpx; } .wear-diamonds>view{ width: 50%; height:100%; border: 1px solid black; } .diamonds-right>view{ width: 100%; height: 50%; border: 1px solid #000; } //-------------

Redis实战(三)Redis主从复制

从架构 1.主从架构图 2.通过命令 mkdir redisCluster创建redis集群文件夹 3.通过命令mkdir 6380   mkdir 6381   mkdir 6382在redisCluster文件夹下创建三个文件夹 4.通过以下命令将redis.conf分别拷贝到6380.6381. 6382文件夹下 cp /usr/local/redis/redis-3.0.2/redis.conf  ./6380 cp /usr/local/redis/redis-3.0.2/redis.

算法 排序lowB三人组 冒泡排序 选择排序 插入排序

参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两个记录序号同等,且两者在原无序记录中的先后秩序依然保持不变,则称所使用的排序方法是稳定的,反之是不稳定

三:QJM HDFS高可用

本文介绍的是HDFS的一种HA方案.虽然有checkpoint node \backup node等,但是不能实现自动的failover. http://hadoop.apache.org/docs/r2.6.3/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html 1.在2.0.0版本以下,namenode是单个的,如果namenode宕机,就会导致整个集群不可用.QJM 是HA的一种实现方式,通过master/sla