一、UIViewController
1、AppDelegate.m文件中的写法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
//1、实例化一个VC,别忘了同时init初始化,不然后面没法用
FirstViewController *first = [[FirstViewController alloc] init];
//2、把一个VC当成window的rootVC,给窗口放进来第一个要显示的页面所在的VC
self.window.rootViewController = first;//把first赋值给了window的根视图控制器
[first release];
[self.window makeKeyAndVisible];
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 = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if(self)
{
//这里用来初始化一些对象,only数据操作,不要操作UI
NSLog(@"1");
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
//一个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 = [UIColor orangeColor];
NSLog(@"2");
//布局UI
[self makeBackGround];
[self makeLabel];
[self makeTextField];
[self makeTwoBtn];
// Do any additional setup after loading the view.
}
-(void)makeBackGround
{
self.view.backgroundColor = [UIColor brownColor];
//导航条
UILabel *navLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, 320, 44)];
navLabel.textColor = [UIColor whiteColor];
navLabel.font = [UIFont boldSystemFontOfSize:22];
navLabel.textAlignment = NSTextAlignmentCenter;
navLabel.text = @"登陆页面";
navLabel.backgroundColor = [UIColor greenColor];
[self.view addSubview:navLabel];
[navLabel release];
}
-(void)makeLabel
{
NSArray *titleArr = @[@"账号:",@"密码:"];
for(int i =0;i<titleArr.count;i++)
{
UILabel *lab = [[UILabel alloc] initWithFrame:CGRectMake(10, 200+i*50, 90, 30)];
lab.textAlignment = NSTextAlignmentRight;
lab.text = titleArr[i];
[self.view addSubview:lab];
[lab release];
}
}
-(void)makeTwoBtn
{
NSArray *btnArr = @[@"登陆",@"注册"];
for(int i = 0;i<btnArr.count;i++)
{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(20+i*160, 300, 120, 30);
btn.backgroundColor = [UIColor greenColor];
[btn setTitle:btnArr[i] forState:UIControlStateNormal];
[self.view addSubview:btn];
[btn addTarget:self action:@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.view viewWithTag: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 = [[UITextField alloc] initWithFrame:CGRectMake(110, 200+i*50, 180, 30)];
text.delegate = self;
text.borderStyle = UITextBorderStyleLine;
text.placeholder = loginArr[i];
[self.view addSubview:text];
[text release];
text.tag = 5000+i;
if(i == 1)
{
text.secureTextEntry = YES;
}
}
}
-(void)loginDown//登陆点击后
{
UITextField *count = (UITextField*)[self.view viewWithTag:5000];
UITextField *pass = (UITextField*)[self.view viewWithTag:5001];
if(count.text.length == 0 || pass.text.length == 0)
{
NSLog(@"有空,重写");
return;
}
//该发起网络请求,把账号和密码发给服务器,等待服务器的返回成功或失败
}
-(void)nextBtnDown//注册点击后
{
//进入第二个页面,从第一个VC进入第二个VC
//实例化下一个页面的VC
SecondViewController *second = [[SecondViewController alloc] init];
//把下一个VC推出来
[self presentViewController:second animated:YES completion: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.view viewWithTag:textField.tag+1];
[nextTextField becomeFirstResponder];
}
else
{
self.view.frame = CGRectMake(0, 0, 320, self.view.frame.size.height);
[self loginDown];//输完密码后,调用登陆方法
}
return YES;
}
//视图将要出现
-(void)viewWillAppear:(BOOL)animated
{
static int num = 10000;
NSLog(@"%d",num);
if(num>10000)
{
self.view.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];
}
num++;
//因为每次登陆页面出现都要读取之前的账号密码,所以不能写进上面的if判断,那样的话重启应用第一次进入登陆页面就不走下面方法了
//读取之前存好的账号和密码,然后赋值给两个textfield
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSString *count = [user objectForKey:@"count"];
NSString *pass = [user objectForKey:@"pass"];
NSLog(@"账号%@,密码%@",count,pass);
if((NSNull*)count == [NSNull null])//判空,当count是null的时候,就会进if,防崩,因为如果是空,还要用,就可能会崩
{
return;
}
//下面用的count和pass都是上面从user里取出来的
UITextField *countTextField = (UITextField*)[self.view viewWithTag:5000];
countTextField.text = count;
UITextField *passTextField = (UITextField*)[self.view viewWithTag: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 = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if(self)
{
NSLog(@"11");
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"12");
self.view.backgroundColor = [UIColor cyanColor];
[self makeBackGround];
[self makeLabel];
[self makeTextField];
[self makeRegisterBtn];
[self makeJudgeCode];
// Do any additional setup after loading the view.
}
-(void)makeJudgeCode
{
for(int i = 0;i<4;i++)//循环做四个label,是为了展示随机数验证码用的
{
UILabel *judgeLabel = [[UILabel alloc] initWithFrame:CGRectMake(210+i*25, 250, 25, 30)];
judgeLabel.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:judgeLabel];
[judgeLabel release];
judgeLabel.tag = 2100+i;
}
[self randomLabel];//首次刷新验证码的内容
//在四个验证码上面盖一层透明的btn,点击btn刷新验证码
UIButton *coverBtn = [UIButton buttonWithType:UIButtonTypeCustom];
coverBtn.frame = CGRectMake(210, 250, 100, 30);
[coverBtn addTarget:self action:@selector(randomLabel) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:coverBtn];
}
-(void)randomLabel//刷新四个label的背景、字体、内容
{
for(int i = 0;i<4;i++)
{
UILabel *lab = (UILabel*)[self.view viewWithTag:2100+i];
lab.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];
lab.textColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];
lab.text = [NSString stringWithFormat:@"%d",arc4random()%10];
}
}
-(void)makeBackGround//背景(页面、导航条、返回按钮)
{
self.view.backgroundColor = [UIColor lightGrayColor];//背景颜色
//做导航条
UILabel *navLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, 320, 44)];
navLabel.backgroundColor = [UIColor brownColor];
navLabel.textAlignment = NSTextAlignmentCenter;
navLabel.font = [UIFont boldSystemFontOfSize:22];
navLabel.textColor = [UIColor whiteColor];
navLabel.text = @"注册页面";
[self.view addSubview:navLabel];
[navLabel release];
//在导航条上做一个返回按钮
UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
backBtn.frame = CGRectMake(10, 7, 50, 30);
[backBtn setTitle:@"返回" forState:UIControlStateNormal];
[backBtn addTarget:self action:@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 = [[UILabel alloc] initWithFrame:CGRectMake(10, 100+i*50, 90, 30)];
signalLabel.backgroundColor = [UIColor clearColor];
signalLabel.text = labelArr[i];
signalLabel.textAlignment = NSTextAlignmentRight;
signalLabel.font = [UIFont systemFontOfSize:18];
[self.view addSubview:signalLabel];
[signalLabel release];
}
}
-(void)makeTextField//做textfield输入框
{
NSArray *textFieldArr = @[@"请输入账号",@"请输入密码",@"请重复密码",@"验证码"];
for(int i = 0;i<textFieldArr.count;i++)
{
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(110, 100+i*50, 160, 30)];
textField.delegate = self;//如果不写这个,textfield的代理方法就不调用了
textField.placeholder = textFieldArr[i];
textField.borderStyle = UITextBorderStyleLine;
[self.view addSubview:textField];
[textField release];
textField.tag = 5000+i;
if(i == 3)
{
textField.frame = CGRectMake(110, 100+i*50, 90, 30);
}
}
}
-(void)makeRegisterBtn//做注册按钮
{
UIButton *regBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
regBtn.frame = CGRectMake(80, 300, 160, 40);
regBtn.backgroundColor = [UIColor brownColor];
[regBtn setTitle:@"注 册" forState:UIControlStateNormal];
[regBtn addTarget:self action:@selector(regBtnDown) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:regBtn];
}
-(void)regBtnDown
{
NSLog(@"注册按钮被点了");
for(int i = 0;i<4;i++)//循环四次,找到所有的textfield,让每个都键盘消失
{
UITextField *temp = (UITextField*)[self.view viewWithTag: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.view viewWithTag:5000+i];
if(temp.text.length == 0)//有一个输入框是空的
{
NSLog(@"有空的重新写");
return;
}
}
//2、判断两次密码是不是一样
UITextField *firstPass = (UITextField*)[self.view viewWithTag:5001];
UITextField *secondPass = (UITextField*)[self.view viewWithTag:5002];
if(![firstPass.text isEqualToString:secondPass.text])//如果两次不一样
{
NSLog(@"两次密码不一样,重写");
return;
}
//3、判断密码长度
if(firstPass.text.length<6||firstPass.text.length>20)
{
NSLog(@"密码长度不对,重写");
return;
}
//4、判断验证码是否正确
NSMutableString *judgeStr = [NSMutableString stringWithCapacity:0];//做一个可变字符串
for(int i = 0;i<4;i++)
{
UILabel *tempJudgeLabel = (UILabel*)[self.view viewWithTag:2100+i];
[judgeStr appendString:tempJudgeLabel.text];//把四个验证码label的字符拼进这个可变字符串
}
//找到验证码textfield
UITextField *judgeTextField = (UITextField*)[self.view viewWithTag:5003];
if(![judgeTextField.text isEqualToString:judgeStr])
{
NSLog(@"验证码错误");
return;
}
//5、如果都成功了,就开始网络请求注册新账号,这个活儿还差一袋烟的功夫
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
UITextField *count = (UITextField*)[self.view viewWithTag:5000];
[user setObject:count.text forKey:@"count"];
[user setObject:firstPass.text forKey:@"pass"];
[user synchronize];
}
#pragma mark textfield的代理
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
//textField是当前正在编辑的输入框
if(textField.tag != 5003)
{
UITextField *nextTextField = (UITextField*)[self.view viewWithTag:textField.tag+1];//下一个的tag就是当前的这个的tag+1
//让下一个textField进入编辑状态
[nextTextField becomeFirstResponder];
}
else
{
[self regBtnDown];//就相当于调用了注册按钮的方法,因为已经全部输入完毕了
}
return YES;
}
-(void)textFieldDidBeginEditing:(UITextField *)textField//开始编辑的时候,屏幕上移
{
self.view.frame = CGRectMake(0, -70, 320, self.view.frame.size.height);
}
-(void)backBtnDown
{
//这是要返回first,返回的时候不要需要实例化一个first的对象了
[self dismissViewControllerAnimated:YES completion: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 = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(0, 20, 320, 44);
[btn setTitle:@"add" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(btnDown) forControlEvents:UIControlEventTouchUpInside];
[self.window addSubview:btn];
UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn1.frame = CGRectMake(0, 70, 320, 44);
[btn1 setTitle:@"read" forState:UIControlStateNormal];
[btn1 addTarget:self action:@selector(readDown) forControlEvents:UIControlEventTouchUpInside];
[self.window addSubview:btn1];
[self.window makeKeyAndVisible];
return YES;
}
-(void)btnDown
{
//本地缓存
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];//做一个NSUserdefaults对象
//使用key-value的组合把一些数组存起来
[user setObject:@"pp" forKey:@"name"];//第一个参数是value,第二个参数是key
[user setObject:@"18" forKey:@"age"];
//key不能重复,因为如果重复了,以最后一次存的为准
//把想存的对象全都写好了之后,保存起来
[user synchronize];//同步到文件
}
-(void)readDown
{
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSString *name = [user objectForKey:@"name"];
NSString *age = [user objectForKey:@"age"];
NSLog(@"%@,%@",name,age);
}
token __NSCFString * @"de54039322033a00a779149c7527fb62e0febe8ef35a688a21cffa8c980119f4" 0x16e406c0