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

来源:互联网 发布:死亡照相术知乎 编辑:程序博客网 时间:2024/06/05 16:21

一、UIViewController

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

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

    

    [first release];

    

    [self.windowmakeKeyAndVisible];

    return YES;

}


2FirstViewController.h文件中的写法

#import <UIKit/UIKit.h>


@interface FirstViewController :UIViewController<UITextFieldDelegate>


@end


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

    {

        return;

    }

    

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

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

}


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

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 = [[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


0 0
原创粉丝点击