UI控件笔记(五):UI之UIViewController和NSUserDefaults
来源:互联网 发布:死亡照相术知乎 编辑:程序博客网 时间:2024/06/05 16:21
一、UIViewController
1、AppDelegate.m文件中的写法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindowalloc] initWithFrame:[UIScreenmainScreen].bounds];
self.window.backgroundColor = [UIColorwhiteColor];
//1、实例化一个VC,别忘了同时init初始化,不然后面没法用
FirstViewController *first = [[FirstViewControlleralloc] init];
//2、把一个VC当成window的rootVC,给窗口放进来第一个要显示的页面所在的VC
self.window.rootViewController = first;//把first赋值给了window的根视图控制器
[first release];
[self.windowmakeKeyAndVisible];
return YES;
}
2、FirstViewController.h文件中的写法
#import <UIKit/UIKit.h>
@interface FirstViewController :UIViewController<UITextFieldDelegate>
@end
3、FirstViewController.m文件中的写法
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [superinitWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if(self)
{
//这里用来初始化一些对象,only数据操作,不要操作UI
NSLog(@"1");
}
return self;
}
- (void)viewDidLoad {
[superviewDidLoad];
//一个VC控制着一个页面,也就是控制着一个View,所以每一个VC都自带了一个被他控制的View,这个View不需要我们手动实例化,我们可以直接用,这个View的大小如果不特别指定,就是window的大小
//当前类是一个VC类,在这里这个类的对象是?self
//self控制了一个View,拥有了一个View,所以当前VC的view就是:self.view
//self.view就相当于当前页面的祖宗视图(父视图),当前页面我们布局的UI都贴在这个self.view上
//1、改变当前页面的背景颜色
self.view.backgroundColor = [UIColororangeColor];
NSLog(@"2");
//布局UI
[selfmakeBackGround];
[selfmakeLabel];
[selfmakeTextField];
[selfmakeTwoBtn];
// Do any additional setup after loading the view.
}
-(void)makeBackGround
{
self.view.backgroundColor = [UIColorbrownColor];
//导航条
UILabel *navLabel = [[UILabelalloc] initWithFrame:CGRectMake(0,20, 320, 44)];
navLabel.textColor = [UIColorwhiteColor];
navLabel.font = [UIFontboldSystemFontOfSize:22];
navLabel.textAlignment =NSTextAlignmentCenter;
navLabel.text = @"登陆页面";
navLabel.backgroundColor = [UIColorgreenColor];
[self.viewaddSubview:navLabel];
[navLabel release];
}
-(void)makeLabel
{
NSArray *titleArr = @[@"账号:",@"密码:"];
for(int i =0;i<titleArr.count;i++)
{
UILabel *lab = [[UILabelalloc] initWithFrame:CGRectMake(10,200+i*50, 90, 30)];
lab.textAlignment =NSTextAlignmentRight;
lab.text = titleArr[i];
[self.viewaddSubview:lab];
[lab release];
}
}
-(void)makeTwoBtn
{
NSArray *btnArr = @[@"登陆",@"注册"];
for(int i =0;i<btnArr.count;i++)
{
UIButton *btn = [UIButtonbuttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(20+i*160,300, 120, 30);
btn.backgroundColor = [UIColorgreenColor];
[btn setTitle:btnArr[i]forState:UIControlStateNormal];
[self.viewaddSubview:btn];
[btn addTarget:selfaction:@selector(twoBtnDown:)forControlEvents:UIControlEventTouchUpInside];
btn.tag = 1000+i;
}
}
-(void)twoBtnDown:(UIButton*)btn
{
//屏幕缩回来先
self.view.frame =CGRectMake(0,0, 320,self.view.frame.size.height);
for(int i =0;i<2;i++)
{
UITextField *temp = (UITextField*)[self.viewviewWithTag:5000+i];
[temp resignFirstResponder];
}
switch (btn.tag) {
case 1000://登陆
{
[self loginDown];
break;
}
case 1001://注册
{
[self nextBtnDown];
break;
}
default:
break;
}
}
-(void)makeTextField
{
NSArray *loginArr = @[@"请输入账号",@"请输入密码"];
for(int i =0;i<loginArr.count;i++)
{
UITextField *text = [[UITextFieldalloc] initWithFrame:CGRectMake(110,200+i*50, 180, 30)];
text.delegate = self;
text.borderStyle =UITextBorderStyleLine;
text.placeholder = loginArr[i];
[self.viewaddSubview:text];
[text release];
text.tag = 5000+i;
if(i == 1)
{
text.secureTextEntry = YES;
}
}
}
-(void)loginDown//登陆点击后
{
UITextField *count = (UITextField*)[self.viewviewWithTag:5000];
UITextField *pass = (UITextField*)[self.viewviewWithTag:5001];
if(count.text.length ==0 || pass.text.length ==0)
{
NSLog(@"有空,重写");
return;
}
//该发起网络请求,把账号和密码发给服务器,等待服务器的返回成功或失败
}
-(void)nextBtnDown//注册点击后
{
//进入第二个页面,从第一个VC进入第二个VC
//实例化下一个页面的VC
SecondViewController *second = [[SecondViewControlleralloc] init];
//把下一个VC推出来
[selfpresentViewController:second animated:YEScompletion:nil];
//用当前页面对象调用
//第一个参数是下一个VC
//第二个参数是是否要动画
//第三个参数是一个block,这个block会在推出第二个页面的动作完成后回调,我们可以选择在这里处理一些事情
//别忘了release
[second release];
}
#pragma mark textfield的代理
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
self.view.frame =CGRectMake(0, -44,320, self.view.frame.size.height);
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
if(textField.tag !=5001)
{//输完账号后,进入输入密码框
UITextField *nextTextField = (UITextField*)[self.viewviewWithTag:textField.tag+1];
[nextTextField becomeFirstResponder];
}
else
{
self.view.frame =CGRectMake(0,0, 320,self.view.frame.size.height);
[selfloginDown];//输完密码后,调用登陆方法
}
return YES;
}
//视图将要出现
-(void)viewWillAppear:(BOOL)animated
{
static int num =10000;
NSLog(@"%d",num);
if(num>10000)
{
self.view.backgroundColor = [UIColorcolorWithRed:arc4random()%255/255.0green:arc4random()%255/255.0blue:arc4random()%255/255.0alpha:1];
}
num++;
//因为每次登陆页面出现都要读取之前的账号密码,所以不能写进上面的if判断,那样的话重启应用第一次进入登陆页面就不走下面方法了
//读取之前存好的账号和密码,然后赋值给两个textfield
NSUserDefaults *user = [NSUserDefaultsstandardUserDefaults];
NSString *count = [user objectForKey:@"count"];
NSString *pass = [user objectForKey:@"pass"];
NSLog(@"账号%@,密码%@",count,pass);
if((NSNull*)count == [NSNullnull])//判空,当count是null的时候,就会进if,防崩,因为如果是空,还要用,就可能会崩
{
return;
}
//下面用的count和pass都是上面从user里取出来的
UITextField *countTextField = (UITextField*)[self.viewviewWithTag:5000];
countTextField.text = count;
UITextField *passTextField = (UITextField*)[self.viewviewWithTag:5001];
passTextField.text = pass;
NSLog(@"3");
}
//视图已经出现
-(void)viewDidAppear:(BOOL)animated
{
NSLog(@"4");
}
//视图将要消失
-(void)viewWillDisappear:(BOOL)animated
{
NSLog(@"5");
}
//视图已经消失
-(void)viewDidDisappear:(BOOL)animated
{
NSLog(@"6");
}
4、SecondViewController.h文件中的写法
#import <UIKit/UIKit.h>
@interface SecondViewController :UIViewController<UITextFieldDelegate>
@end
5、SecondViewController.m文件中的写法
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [superinitWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if(self)
{
NSLog(@"11");
}
return self;
}
- (void)viewDidLoad {
[superviewDidLoad];
NSLog(@"12");
self.view.backgroundColor = [UIColorcyanColor];
[selfmakeBackGround];
[selfmakeLabel];
[selfmakeTextField];
[selfmakeRegisterBtn];
[selfmakeJudgeCode];
// Do any additional setup after loading the view.
}
-(void)makeJudgeCode
{
for(int i =0;i<4;i++)//循环做四个label,是为了展示随机数验证码用的
{
UILabel *judgeLabel = [[UILabelalloc] initWithFrame:CGRectMake(210+i*25,250, 25, 30)];
judgeLabel.textAlignment = NSTextAlignmentCenter;
[self.viewaddSubview:judgeLabel];
[judgeLabel release];
judgeLabel.tag = 2100+i;
}
[selfrandomLabel];//首次刷新验证码的内容
//在四个验证码上面盖一层透明的btn,点击btn刷新验证码
UIButton *coverBtn = [UIButtonbuttonWithType:UIButtonTypeCustom];
coverBtn.frame = CGRectMake(210, 250, 100, 30);
[coverBtn addTarget:selfaction:@selector(randomLabel)forControlEvents:UIControlEventTouchUpInside];
[self.viewaddSubview:coverBtn];
}
-(void)randomLabel//刷新四个label的背景、字体、内容
{
for(int i =0;i<4;i++)
{
UILabel *lab = (UILabel*)[self.viewviewWithTag:2100+i];
lab.backgroundColor = [UIColorcolorWithRed:arc4random()%255/255.0green:arc4random()%255/255.0blue:arc4random()%255/255.0alpha:1];
lab.textColor = [UIColorcolorWithRed:arc4random()%255/255.0green:arc4random()%255/255.0blue:arc4random()%255/255.0alpha:1];
lab.text = [NSStringstringWithFormat:@"%d",arc4random()%10];
}
}
-(void)makeBackGround//背景(页面、导航条、返回按钮)
{
self.view.backgroundColor = [UIColorlightGrayColor];//背景颜色
//做导航条
UILabel *navLabel = [[UILabelalloc] initWithFrame:CGRectMake(0,20, 320, 44)];
navLabel.backgroundColor = [UIColorbrownColor];
navLabel.textAlignment =NSTextAlignmentCenter;
navLabel.font = [UIFontboldSystemFontOfSize:22];
navLabel.textColor = [UIColorwhiteColor];
navLabel.text = @"注册页面";
[self.viewaddSubview:navLabel];
[navLabel release];
//在导航条上做一个返回按钮
UIButton *backBtn = [UIButtonbuttonWithType:UIButtonTypeRoundedRect];
backBtn.frame = CGRectMake(10, 7, 50, 30);
[backBtn setTitle:@"返回"forState:UIControlStateNormal];
[backBtn addTarget:selfaction:@selector(backBtnDown)forControlEvents:UIControlEventTouchUpInside];
[navLabel addSubview:backBtn];
//因为btn添加到了一个我们自己的View上,为了让btn可用,我们需要对这个view设置一个属性
navLabel.userInteractionEnabled =YES;
//我们永远要保证,当前交互兑现的父视图的userInteractionEnabled是YES
}
-(void)makeLabel//做文字标签(每个textfield左边的提示标签)
{
NSArray *labelArr =@[@"账号:",@"密码:",@"重复密码:",@"验证码:"];
for(int i =0;i<labelArr.count;i++)
{
UILabel *signalLabel = [[UILabelalloc] initWithFrame:CGRectMake(10,100+i*50, 90, 30)];
signalLabel.backgroundColor = [UIColorclearColor];
signalLabel.text = labelArr[i];
signalLabel.textAlignment = NSTextAlignmentRight;
signalLabel.font = [UIFontsystemFontOfSize:18];
[self.viewaddSubview:signalLabel];
[signalLabel release];
}
}
-(void)makeTextField//做textfield输入框
{
NSArray *textFieldArr =@[@"请输入账号",@"请输入密码",@"请重复密码",@"验证码"];
for(int i =0;i<textFieldArr.count;i++)
{
UITextField *textField = [[UITextFieldalloc] initWithFrame:CGRectMake(110,100+i*50, 160, 30)];
textField.delegate =self;//如果不写这个,textfield的代理方法就不调用了
textField.placeholder = textFieldArr[i];
textField.borderStyle = UITextBorderStyleLine;
[self.viewaddSubview:textField];
[textField release];
textField.tag = 5000+i;
if(i == 3)
{
textField.frame = CGRectMake(110, 100+i*50, 90,30);
}
}
}
-(void)makeRegisterBtn//做注册按钮
{
UIButton *regBtn = [UIButtonbuttonWithType:UIButtonTypeRoundedRect];
regBtn.frame = CGRectMake(80, 300, 160, 40);
regBtn.backgroundColor = [UIColorbrownColor];
[regBtn setTitle:@"注册"forState:UIControlStateNormal];
[regBtn addTarget:selfaction:@selector(regBtnDown)forControlEvents:UIControlEventTouchUpInside];
[self.viewaddSubview:regBtn];
}
-(void)regBtnDown
{
NSLog(@"注册按钮被点了");
for(int i =0;i<4;i++)//循环四次,找到所有的textfield,让每个都键盘消失
{
UITextField *temp = (UITextField*)[self.viewviewWithTag:5000+i];
[temp resignFirstResponder];
}
self.view.frame =CGRectMake(0,0, 320,self.view.frame.size.height);
//做各种判断
//1、有没有空着的textfield
for(int i =0;i<4;i++)
{
UITextField *temp = (UITextField*)[self.viewviewWithTag:5000+i];
if(temp.text.length ==0)//有一个输入框是空的
{
NSLog(@"有空的重新写");
return;
}
}
//2、判断两次密码是不是一样
UITextField *firstPass = (UITextField*)[self.viewviewWithTag:5001];
UITextField *secondPass = (UITextField*)[self.viewviewWithTag:5002];
if(![firstPass.textisEqualToString:secondPass.text])//如果两次不一样
{
NSLog(@"两次密码不一样,重写");
return;
}
//3、判断密码长度
if(firstPass.text.length<6||firstPass.text.length>20)
{
NSLog(@"密码长度不对,重写");
return;
}
//4、判断验证码是否正确
NSMutableString *judgeStr = [NSMutableStringstringWithCapacity:0];//做一个可变字符串
for(int i =0;i<4;i++)
{
UILabel *tempJudgeLabel = (UILabel*)[self.viewviewWithTag:2100+i];
[judgeStr appendString:tempJudgeLabel.text];//把四个验证码label的字符拼进这个可变字符串
}
//找到验证码textfield
UITextField *judgeTextField = (UITextField*)[self.viewviewWithTag:5003];
if(![judgeTextField.textisEqualToString:judgeStr])
{
NSLog(@"验证码错误");
return;
}
//5、如果都成功了,就开始网络请求注册新账号,这个活儿还差一袋烟的功夫
NSUserDefaults *user = [NSUserDefaultsstandardUserDefaults];
UITextField *count = (UITextField*)[self.viewviewWithTag:5000];
[user setObject:count.textforKey:@"count"];
[user setObject:firstPass.textforKey:@"pass"];
[user synchronize];
}
#pragma mark textfield的代理
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
//textField是当前正在编辑的输入框
if(textField.tag !=5003)
{
UITextField *nextTextField = (UITextField*)[self.viewviewWithTag:textField.tag+1];//下一个的tag就是当前的这个的tag+1
//让下一个textField进入编辑状态
[nextTextField becomeFirstResponder];
}
else
{
[selfregBtnDown];//就相当于调用了注册按钮的方法,因为已经全部输入完毕了
}
return YES;
}
-(void)textFieldDidBeginEditing:(UITextField *)textField//开始编辑的时候,屏幕上移
{
self.view.frame =CGRectMake(0, -70,320, self.view.frame.size.height);
}
-(void)backBtnDown
{
//这是要返回first,返回的时候不要需要实例化一个first的对象了
[selfdismissViewControllerAnimated:YEScompletion:nil];
//返回的时候,用当前页面对象调用方法
//第一个参数是是否有动画
//第二个参数是返回后,要干点什么
}
-(void)viewWillAppear:(BOOL)animated
{
NSLog(@"13");
}
-(void)viewDidAppear:(BOOL)animated
{
NSLog(@"14");
}
-(void)viewWillDisappear:(BOOL)animated
{
NSLog(@"15");
}
-(void)viewDidDisappear:(BOOL)animated
{
NSLog(@"16");
}
二、UIViewController执行流程
A:进入登录页面
1、FirstViewController的初始化initWithNibName
2、FirstViewController的加载initWithNibName
3、FirstViewController视图的将要出现viewWillAppear
4、FirstViewController视图的已经出现viewDidAppear
B:由登录页面进入注册页面
5、SecondViewController的初始化initWithNibName
6、SecondViewController的加载initWithNibName
7、FirstViewController视图的将要消失viewWillDisappear
8、SecondViewController视图的将要出现viewWillAppear
9、SecondViewController视图的已经出现viewDidAppear
10、FirstViewController视图的已经消失viewDidDisappear
C:由注册页面进入登录页面
11、SecondViewController视图的将要消失viewWillDisappear
12、FirstViewController视图的将要出现viewWillAppear
13、FirstViewController视图的已经出现viewDidAppear
14、SecondViewController视图的已经消失viewDidDisappear
三、NSUserDefaults用来传值
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindowalloc] initWithFrame:[UIScreenmainScreen].bounds];
self.window.backgroundColor = [UIColorwhiteColor];
UIButton *btn = [UIButtonbuttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(0,20, 320, 44);
[btn setTitle:@"add"forState:UIControlStateNormal];
[btn addTarget:selfaction:@selector(btnDown)forControlEvents:UIControlEventTouchUpInside];
[self.windowaddSubview:btn];
UIButton *btn1 = [UIButtonbuttonWithType:UIButtonTypeRoundedRect];
btn1.frame = CGRectMake(0,70, 320, 44);
[btn1 setTitle:@"read"forState:UIControlStateNormal];
[btn1 addTarget:selfaction:@selector(readDown)forControlEvents:UIControlEventTouchUpInside];
[self.windowaddSubview:btn1];
[self.windowmakeKeyAndVisible];
return YES;
}
-(void)btnDown
{
//本地缓存
NSUserDefaults *user = [NSUserDefaultsstandardUserDefaults];//做一个NSUserdefaults对象
//使用key-value的组合把一些数组存起来
[user setObject:@"pp"forKey:@"name"];//第一个参数是value,第二个参数是key
[user setObject:@"18"forKey:@"age"];
//key不能重复,因为如果重复了,以最后一次存的为准
//把想存的对象全都写好了之后,保存起来
[user synchronize];//同步到文件
}
-(void)readDown
{
NSUserDefaults *user = [NSUserDefaultsstandardUserDefaults];
NSString *name = [user objectForKey:@"name"];
NSString *age = [user objectForKey:@"age"];
NSLog(@"%@,%@",name,age);
}
token __NSCFString *@"de54039322033a00a779149c7527fb62e0febe8ef35a688a21cffa8c980119f4"0x16e406c0
- UI控件笔记(五):UI之UIViewController和NSUserDefaults
- UI控件笔记(二):UI之UILabel和UIImageView
- UI之uiViewController
- UI总结之UIViewController 和 UIView关系
- iOS UI学习笔记(六)UIViewController
- UI基础学习之(七):UIViewController
- UI控件笔记(一):UI之UIView的属性
- UI控件笔记(三):UI之UIButton的属性
- UI控件笔记(四):UI之UITextField的属性
- UI控件笔记(九):UI之UITabBarController
- UI控件笔记(十三):UI之MVC
- UI控件笔记(六):UI之UINavigationController、navigationBar和UIView的封装
- UI控件笔记(十七):UI之UI阶段控件常用方法大全总结
- 【UI初级--连载五】---------UIViewController(视图控制器)
- UI - UIViewController
- UI - UIViewController
- ui--UIViewController
- cocos2d-C++ 学习UI控件(五)之 PageView
- STM8 SPI的学习
- SpringMVC源代码学习外传(三)RequestCondition
- Bug之Could not find Developer Disk Image
- mac pro 笔记本电脑 外接显示器 无图像 / 不显示
- 红外遥控解码
- UI控件笔记(五):UI之UIViewController和NSUserDefaults
- iOS第三方音频框架TheAmazingAudioEngine使用及音效实现介绍
- Eclipse实用快捷键
- 安装mathtype6.5后word2007工具栏上没有mathtype选项卡解决办法
- string怎么转换为char*
- eclipse中properties文件编码问题
- 关于使用xheditor实现图片上传
- 详解DataNode的容量监控页面参数
- Linux-2016/05/16