只有一条,用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方法如下,
以后会详细分析
</span>
+(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>