UI控件笔记(五):UI之UIViewController和NSUserDefaults

一、UIViewController

1AppDelegate.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当成windowrootVC,给窗口放进来第一个要显示的页面所在的VC

    self.window.rootViewController = first;//first赋值给了window的根视图控制器

    

    [first release];

    

    [self.window makeKeyAndVisible];

    return YES;

}


2FirstViewController.h文件中的写法

#import <UIKit/UIKit.h>


@interface FirstViewController : UIViewController<UITextFieldDelegate>


@end


3FirstViewController.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,所以当前VCview就是: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])//判空,当countnull的时候,就会进if,防崩,因为如果是空,还要用,就可能会崩

    {

        return;

    }

    

    //下面用的countpass都是上面从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;

    //我们永远要保证,当前交互兑现的父视图的userInteractionEnabledYES

}


-(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:进入登录页面

1FirstViewController的初始化initWithNibName

2FirstViewController的加载initWithNibName

3FirstViewController视图的将要出现viewWillAppear

4FirstViewController视图的已经出现viewDidAppear


B:由登录页面进入注册页面

5SecondViewController的初始化initWithNibName

6SecondViewController的加载initWithNibName

7FirstViewController视图的将要消失viewWillDisappear

8SecondViewController视图的将要出现viewWillAppear

9SecondViewController视图的已经出现viewDidAppear

10FirstViewController视图的已经消失viewDidDisappear


C:由注册页面进入登录页面

11SecondViewController视图的将要消失viewWillDisappear

12FirstViewController视图的将要出现viewWillAppear

13FirstViewController视图的已经出现viewDidAppear

14SecondViewController视图的已经消失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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值