关闭

IOS学习记录之登陆界面各功能的实现

标签: ios界面服务器数据
385人阅读 评论(0) 收藏 举报


只有一条,用table写,继承的scrollview里面有个自动偏移方法,防止键盘挡住输入口。


IOS学习记录之登陆界面各功能的实现

说明:本博客主要记录本人在IOS开发学习阶段所做小项目的过程,本文主要讲登陆界面输入框设置,记住密码功能,与服务器连接,网络简单数据解析等功能。

实物图如下


实现过程及代码如下:
 新建一个视图控制器rootvewcontroller作为登陆界面视图控制器,然后进行界面布局,可以使用XIB,storyboard和纯代码,苹果公司是支持用storyboard。本文就用storyboard进行布局。
      1,页面布局如上图1所示,在storyboard设置好各个控件位置后,可以用代码进行界面的优化
//设置界面控件属性
-(void)initview{
   _nichenglan.borderStyle=UITextBorderStyleRoundedRect;
    _nichenglan.layer.borderColor=(__bridge CGColorRef)([UIColor lightGrayColor]);
//设置帐号输入框背景文字    
   _nichenglan.placeholder=@"请输入账号";
    _nichenglan.textColor=[UIColor blackColor];
    _nichenglan.textAlignment=UITextAlignmentCenter;
//设置输入框类型为圆角矩形   
    _mimalan.borderStyle=UITextBorderStyleRoundedRect;
    _mimalan.layer.borderColor=(__bridge CGColorRef)([UIColor lightGrayColor]);
    _mimalan.placeholder=@"请输入密码";
    _mimalan.textColor=[UIColor blackColor];
    _mimalan.textAlignment=UITextAlignmentCenter;
//设置登陆按钮背景图片
    [_loginbtn setImage:[UIImage imageNamed:NSLocalizedString(@"lg_btn_bg", nil)] forState:UIControlStateNormal];
    [_loginbtn addTarget:self action:@selector(loginaction:) forControlEvents:UIControlEventTouchUpInside];
//设置记住密码按钮背景图片,未被选中状态和被选中状态设为相应的图片背景
    [_remenberpwd setImage:[UIImage imageNamed:NSLocalizedString(@"lg_pwd_remember", nil)] forState:UIControlStateNormal];
    [_remenberpwd setImage:[UIImage imageNamed:NSLocalizedString(@"lg_pwd_remember_selected",nil)] forState:UIControlStateSelected];
//为记住密码按钮添加点击事件
    [_remenberpwd addTarget:self action:@selector(pwdRememberClick:) forControlEvents:UIControlEventTouchUpInside];
//当用户名被保存到<span style="font-family: Arial, Helvetica, sans-serif;">NSUserDefaults时,记该用户被记住后,登陆时可以直接将账号,密码设置到输入框中,实现记住密码功能。</span>
    if([[NSUserDefaults standardUserDefaults] objectForKey:@"UserId"]) {//找到用户名
        [_nichenglan setText:[[NSUserDefaults standardUserDefaults] objectForKey:@"UserId"]];
        [_mimalan setText:[[NSUserDefaults standardUserDefaults] objectForKey:@"UserPassword"]];
    } else {//找不到用户名
        [_nichenglan  setText:@""];
        [_mimalan setText:@""];
        //        [AlertNotice showNotice:@"can not find"];
    }
//打开程序,自动检查<span style="font-family: Arial, Helvetica, sans-serif;">NSUserDefaults,如果密码已经被记住,</span>记住密码按钮设置被被选中状态,否则设置为未选中状态。
    if([[NSUserDefaults standardUserDefaults] boolForKey:@"pwdRemember"]) {
        [_remenberpwd setSelected:YES];
    } else {
        [_remenberpwd setSelected:NO];
    }
    
}
上述代码分析: 因为xcode并没有选择控件,只能用button,通过变换背景实现被选中状态,默认背景图片为未选中状态,进入程序会读取NSUserDefaults,检测
是否已记住密码<span style="font-family: Arial, Helvetica, sans-serif;">,这一个</span><span style="color: rgb(51, 51, 51); font-family: arial; font-size: 13px; line-height: 20px;">适合存储轻量级的本地数据,可以存储用户账户密码昵称是否记住密码等数据。详细用法见下文。</span>
 
2,然后是登陆条件的判定,需要用到简单的网络数据解析。
- (IBAction)loginaction:(id)sender {
    _currentname=_nichenglan.text;
    _currentpsw=_mimalan.text;
//首先将服务器网址存储在自定义的URL中,用用户名和密码框中的数据去填充网址,这样就可以将数据传递给服务器端。
    NSString *urlstr=[[NSString alloc]initWithFormat:@"http://115.28.26.84:8095/PersonalPage/login.aspx?userid=%@&psd=%@",_currentname,_currentpsw];
//将网址中中文及一些特殊字符进行编码
    NSString *utf8String=[urlstr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *loginurl=[NSURL URLWithString:urlstr];
//此处调用了自定义的一个webgetdata方法,将服务器端数据存储于logindata中
    NSData *logindata=[webgetdata getDataByURL:loginurl withParameter:utf8String];
    if (logindata) {
//为了方便处理返回的数据,调用了自定义的webgetdictionary方法将数据解析出来以字典格式存入loginDict中
        NSMutableDictionary *loginDict=[webgetdictionary getDictByData:logindata];
        NSLog(@"%@",loginDict);
//获取loginDict中state关键字的值,即服务器返回的登陆状态
        _state=[NSString stringWithFormat:@"%@",[loginDict objectForKey:@"State"]];
       // NSLog(@"%@",loginDict);
//如果登陆成功,即_state值为1
        if ([_state isEqualToString:@"1"]) {
//跳转到程序主界面
            ViewController *viewcontroller=[self.storyboard instantiateViewControllerWithIdentifier:@"mainview"];
            [self presentViewController:viewcontroller animated:YES completion:nil];
            //获取个人信息和充电桩等信息
//连接服务器,获取用户信息
            NSString *infourlstr=[NSString stringWithFormat:@"http://115.28.26.84:8095/PersonalPage/getInfo.aspx?UserId=%@",_currentname];
            NSURL *infourl=[NSURL URLWithString:infourlstr];
            NSString *utf8String1=[infourlstr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            NSData *infodata=[webgetdata getDataByURL:infourl withParameter:utf8String1];
           Dictionary *infodict=[webgetdictionary getDictByData:infodata];
//因为获取的数据为双层的字典形式,则以Content为主键,将用户信息存入字典infodict1
            infodict1=[infodict objectForKey:@"Content"];
//然后将用户信息存入自带的<span style="font-family: arial;">NSUserDefaults中</span>
            [[NSUserDefaults standardUserDefaults]setValuesForKeysWithDictionary:infodict1];
        }
        else if ([_state isEqualToString:@"0"]){
            [alertnotice showNotice:@"错误" withMessage:@"账号或密码错误" Withcanclebutton:@"确定" otherButtonTitles:nil, nil];
        }
    }
               }

一上代码分析,关于网络数据的解析
webgetdata方法如下,以后会详细分析

+(NSMutableData *) getDataByURL:(NSURL *) url withParameter:(NSString *) parameter{
    NSMutableData *data=nil;
    NSError *error;
    NSMutableURLRequest *request=[[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
    [request setHTTPMethod:@"post"];//设置请求方式为POST,默认为GET
    NSMutableData *datal=[parameter dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:datal];
    //连接服务器,获取data
    data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
//如果网络有错误
    if (error) {
        NSLog(@"[%@ %@] url to data error: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), error.localizedDescription);
        data = nil;
        [alertnotice showNotice:@"错误" withMessage:@"请检查网络连接" Withcanclebutton:@"确定" otherButtonTitles:nil, nil];
    }
    return data;
}
webgetdictionary方法如下,以后会详细分析
<pre name="code" class="objc">+(NSMutableDictionary *)getDictByData:(NSData*)data{
    NSMutableDictionary *dict=nil;
    NSError *error;
//使用内置的<span style="font-family: arial;">NSJSONSerialization可以对获取的数据进行解析</span>
    dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
    if (error) {
        NSLog(@"[%@ %@] url to dict error: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), error.localizedDescription);
        dict = nil;    }
    return dict;
}
解析出来的数据json格式的,如下

<span style="font-family: Times;font-size:14px;">{"State":1,"Msg":"查询成功","Content":{"UserId":"cww","UserPassword":"123","UserDisplay":"","UserName":"cww","UserSexual":"男","UserAge":23,"UserCellphone":"15623617338","UserRealName":"XXX","UserCar":"鄂A8888","UserMoney":"3000","UserPoint":"2000","UserSubsidy":"1000","UserCredit":0}}</span>
<span style="font-family: Times;font-size:14px;">
</span>
<span style="font-family: Times;font-size:14px;">将其存入字典中,那么以Content为主键,用Objectforkey方法将Content内用户信息存入新的字典中。</span>
<span style="font-family: Times;font-size:14px;">
还有一点,输入框实现,点击屏幕关闭键盘的方法:
<pre name="code" class="objc">-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesBegan:touches withEvent:event];
    [_nichenglan resignFirstResponder];
    [_mimalan resignFirstResponder];
}
主要是让textfield失去第一响应者的权利。
</span>

<span style="font-family:Times;font-size:14px;">这样就完成了登陆界面的实现,同时获取了用户的信息并保存在本地。
</span><span style="font-family:arial;font-size:12px;">
</span>





0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3084次
    • 积分:144
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:0篇
    • 译文:1篇
    • 评论:0条
    文章分类