IOS学习日志(Controller)1.2

来源:互联网 发布:福州几个打车软件 编辑:程序博客网 时间:2024/06/05 02:21

1.使用xib简化创建界面的过程

view通过加载xib文件来完成设置
xml可扩展语言
目标:通过少写或不写代码的情况下,完成界面的设置
如何实现?
借助于系统的Interface Builder完成,IB以前是一款独立的软件,现在整合到了Xcode中,只需要在创建自定义的控制器时,勾选下面的“Also Create Xib file”选项,则系统自动生成与控制器名相同,后缀为xib的文件
xib文件?
本质:一个xml文件,通过IB这个可视化的工具,拖拽界面,则系统会将拖拽动作转换成代码存到xib文件中
当创建控制器的实例,告诉系统,通过加载指定xib文件,完成控制器view的创建及设计,于是系统就自动创建了界面上需要的控件的实例

1.2如何在控制器中访问系统自动创建的那些对象呢?

借助于 IBOutlet关键字
只需要在控制器,生成带有IBOutlet关键字的引用,然后在拆分视图下,从空心圆中拉线,连接到界面上对应的视图即可
简便操作形式:选中控件按住control,再按下左键,拖出一条线,连接到m或h文件的interface区域中
AlsoCreatXibfile,UIView实例由系统与控制器自带的视图连接在一起

1.3如何在控制器中为控件添加时间响应?

借助于IBAction关键字
操作形式:选中控件,按住control,再按下左键,脱出一条线,连接到m文件的implementation区域中
填写name(方法名) 点击connect

#import "MyViewController.h"@interface MyViewController ()//目标:能够在控制器中访问系统自动创建的label等对象//增加一个记录label的引用@property (nonatomic,weak) IBOutlet UILabel *MyLabel;@property (weak, nonatomic) IBOutlet UIButton *myButton;@property (weak, nonatomic) IBOutlet UIButton *myButton2;@end@implementation MyViewController//加载xib在viewDidLoad之前完成- (void)viewDidLoad {    [super viewDidLoad];    self.myButton2.backgroundColor=[UIColor redColor];    //添加按钮的点击事件    [self.myButton addTarget:self action:@selector(changeText:) forControlEvents:UIControlEventTouchUpInside];    UILabel *label;//label引用//    [[UILabel alloc]init];//对象    // Do any additional setup after loading the view from its nib.}//通过连线的方式为button2添加了touchUpInside事件的响应只要点击了按钮,该方法自动执行//sender代表的是触发这个方法的事件源,也就是点击的是谁,sender就是谁,这里的sender就是myButton2- (IBAction)clickButton2:(id)sender {    NSLog(@"...");}-(void)changeText:(id)sender//这个id最好具体化{    self.MyLabel.text=@"Hello Kitty";    NSLog(@"%@",[sender titleForState:UIControlStateNormal]);}- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}

2.UITextField 单行文本框

核心属性:
text属性(NSString)获取用户的输入

2.1目标:关闭键盘

弹起键盘的原因:因为文本框成为了第一响应者

当用户触摸屏幕上某点之后系统做了什么?
首先,开启了查找hit-view的过程,根据触点的坐标,视图给直接子视图发hitTest消息,询问改点是否在其中,子视图发现如果点不在其中,则返回nil,如果发现点在其中,则该子视图再继续给他的所有直接子视图发hitTest消息,层层深入后,直到某个视图不再具有子视图,但是点在它内部,则它将自己返回,于是就找到了hitView
然后,系统开始提供响应,如果该视图有响应,则执行响应代码,如果没有提供响应,则将事件传递给父视图甚至于控制器,一直到代理,如果这个链条中都没有提供响应,则该事件被抛弃
但是,如果这次触摸的点在文本框中,hitView为UITextField类型的,则不会再去一层层的找响应,而是直接让文本框成为了第一响应者,window检测到第一响应者类型是文本框时,自动弹出键盘
所以,如果想关闭键盘,则让文本框放弃第一响应者身份即可

2.2成为第一响应者(弹键盘)

[textField becomeFIrstResponder];

2.3释放第一响应者(关键盘)

[textField resignFirstResponder];

2.4其它更方便关闭键盘的方式

前提:当界面上包含很多文本框时,一个一个的释放第一响应者身份比较麻烦 解决方案:设置文本框的父视图结束编辑状态即可
[view endEditing:YES];

2.5什么时候关键盘?

时机一:点击空白处
重写控制器的touchesBegan方法即可

时机二:点击键盘的右下角
选中textField,连线一个方法,其中,Events参数一定要选择“Did End On Exit”

#import "MyViewController.h"@interface MyViewController ()@property (weak, nonatomic) IBOutlet UITextField *textField;@end@implementation MyViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view from its nib.}- (IBAction)printInfo:(id)sender {    NSLog(@"%@",self.textField.text);}- (IBAction)openKeyboard:(id)sender {    //成为第一响应者    [self.textField becomeFirstResponder];}//点击管理键盘按钮- (IBAction)closeKeyboard:(id)sender {    //放弃第一响应者身份    //[self.textField resignFirstResponder];    [self.view endEditing:YES];//批量的关}//关键盘的时机一:触摸空白处(触摸的是控制器的view)-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    [self.view endEditing:YES];}//关键盘的时机二:点击右下角//系统帮你做了两件事情,检测按钮,放弃第一响应者身份- (IBAction)pressGoButton:(id)sender {}- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}

3.strong and weak

帮助我们解决的问题:对象能不能释放的问题
能不能释放的唯一标准就是:该对象的引用计数器是否为0
strong:会使得对象的引用计数器+1
weak:不会使得对象的引用计数器+1
将一个对象通过 addXXX方法添加到数组中时,同样会使得对象的引用计数器+1

所以,当将一个实例添加到self.view中时,引用计数器已经为1了,视图是由self.view持有的,如果,一旦添加属性,声明一个单独的引用来指向对象时,声明为strong会导致计数器再+1,当视图需要从self.view中移除掉时,引用计数器-1,但计数器依然会因为这个strong引用的存在而是1, 一个不再出现在界面的视图,因为计数器不为0而驻留在内容中,是比较浪费资源的,所以,添加到self.view中的子视图,再添加一个属性引用时,就不要使用strong,而最好选择weak.

4.其它常用控件

4.1UIStepper 步进控件

作用:记录一个浮点数值,并且控件提供了两个按钮界面,由用户精确的控制记录的这个值的递增或递减
核心属性:value
核心事件:捕获到valueChanged

#import "MyViewController.h"@interface MyViewController ()@property (weak, nonatomic) IBOutlet UIStepper *stepper;@property (weak, nonatomic) IBOutlet UILabel *label;@end@implementation MyViewController- (void)viewDidLoad {    [super viewDidLoad];    //设置stepper    self.stepper.minimumValue=10;    self.stepper.maximumValue=35;    self.stepper.value=17;    self.stepper.stepValue=1;    //界面刚一呈现,显示stepper背后的value    self.label.text=[NSString stringWithFormat:@"%.0f",self.stepper.value];//    self.label.font=[UIFont systemFontOfSize://                     self.stepper.value];//        // Do any additional setup after loading the view from its nib.}//点击加减号时,修改value,自动执行该方法- (IBAction)showValue:(id)sender {    self.label.text=[NSString stringWithFormat:@"%.0f",self.stepper.value];//    self.label.font=[UIFont systemFontOfSize://                     self.stepper.value];}

4.2UISlider 滑块控件

作用:记录一个浮点数值,通过一个可滑动的按钮,快速的在某个范围内得到一个不容易精确控制的数值    核心属性:value    核心事件:valueChanged
#import "MyViewController.h"@interface MyViewController ()@property (weak, nonatomic) IBOutlet UISlider *slider;@property (weak, nonatomic) IBOutlet UISlider *greenSlider;@property (weak, nonatomic) IBOutlet UISlider *blueSlider;@property (weak, nonatomic) IBOutlet UILabel *resultLabel;@end@implementation MyViewController- (void)viewDidLoad {    [super viewDidLoad];//    self.resultLabel.text=[NSString stringWithFormat:@"%f",self.slider.value];  self.resultLabel.textColor=[UIColor colorWithRed:self.slider.value green:self.greenSlider.value blue:self.blueSlider.value alpha:1];    // Do any additional setup after loading the view from its nib.}- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}- (IBAction)showValue:(UISlider*)sender {//        self.resultLabel.text=[NSString stringWithFormat:@"%f",self.slider.value];    self.resultLabel.textColor=[UIColor colorWithRed:self.slider.value green:self.greenSlider.value blue:self.blueSlider.value alpha:1];}

4.3UISwitch 开关控件

    作用:记录一个布尔值,通过点击的方式,可以记录用户的是或否的选择    核心属性:on(BOOL类型)    核心事件:valueChanged
#import "MyViewController.h"@interface MyViewController ()@property (weak, nonatomic) IBOutlet UISwitch *mySwitch;@end@implementation MyViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view from its nib.}- (IBAction)pressSwitch:(id)sender {    if (self.mySwitch.isOn) {        //判断开关的on属性,看是YES还是NO        NSLog(@"开关打开了");    }    else    {        NSLog(@"开关关闭了");    }}//点击按钮后改变开关的状态- (IBAction)changeSwitchState:(id)sender {//    if (self.mySwitch.isOn) {//        [self.mySwitch setOn:NO animated:YES];//    }//    else{//        [self.mySwitch setOn:YES animated:YES];//    }    [self.mySwitch setOn:!self.mySwitch.isOn animated:YES];}

5.UIAlertController

5.1警告框AlertView(位于屏幕中间)

5.1警告框AlertView(位于屏幕中间)
step1:创建UIAlertController的实例,创建实例时需要指定一个style参数,将该参数写成Alert样式,则代表创建的是警告框
step2:需要几个按钮创建几个UIAlertAction实例,创建可以收集用户意图的按钮——UIAlertAction,创建时,不仅仅说明该按钮上要显示的提示性文字,还要使用block的方式来设定点击了该按钮之后要做的事情
step3:将AlertAction添加到AlertController中
step4:向AlertController中添加textField(可选)
step5:使用控制器的presentViewController方法将AlertController推出显示

#import "MyViewController.h"@interface MyViewController ()@end@implementation MyViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view from its nib.}-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    //1.创建AlertController    UIAlertController *alert=[UIAlertController alertControllerWithTitle:@"title" message:@"message" preferredStyle:UIAlertControllerStyleAlert];    //2.创建界面上的按钮    UIAlertAction *actionYes=[UIAlertAction actionWithTitle:@"YES" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {//block的引发是在点了yes以后,        //获取在文本框中输入的用户名和密码        NSString *name=alert.textFields[0].text;        NSString *pwd=alert.textFields[1].text;        NSLog(@"name=%@ pwd=%@",name,pwd);    }];    UIAlertAction *actionNo=[UIAlertAction actionWithTitle:@"NO" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {        NSLog(@"NO");    }];    //3.将按钮添加到AlertController中    [alert addAction:actionNo];    [alert addAction:actionYes];    //4.为AlertController添加文本框    [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {        //配置添加的用户名文本框            textField.placeholder=@"用户名";            }];    [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {        //配置添加的密码文本框        textField.textColor=[UIColor redColor];        textField.secureTextEntry=YES;    }];     //5.显示AlertController,界面间的切换,控制器之间的交换    [self presentViewController:alert animated:YES completion:nil];}@end

5.2操作表(ActionSheet)(从屏幕底部升起

补充:
getter=isOpen的意思是:为open属性的getter方法重写了一个名字叫isOpen,以后再来读取open属性时就食用isOpen这个名字即可,改名的目的是为了增加程序的易读性,区分与if(对象)这样的比较形式,一旦看到if(isXXX),那么isXXX一定是一个布尔值
@property (nonatomic,getter=isOpen)BOOL open;
//想给open属性赋值:
[self setOpen:NO];
//使用点语法为open属性赋值:
self.open=NO;
//想读取open属性:
if([self open])=>if(self isOpen)
//使用点语法读取open属性:
if(self.open)=>if(self.isOpen)
if(self) 等价于 if(self!=nil)
if(!self) 等价于 if(self==nil)

#import "MyViewController.h"@interface MyViewController ()@end@implementation MyViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view from its nib.}-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    UIAlertController *actionSheet=[UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];    //最无害的操作在屏幕的低端    UIAlertAction *action1=[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];    UIAlertAction *action2=[UIAlertAction actionWithTitle:@"转发" style:UIAlertActionStyleDefault handler:nil];    UIAlertAction *action3=[UIAlertAction actionWithTitle:@"回复" style:UIAlertActionStyleDefault handler:nil];    UIAlertAction *action4=[UIAlertAction actionWithTitle:@"删除" style:UIAlertActionStyleDestructive handler:nil];    [actionSheet addAction:action4];    [actionSheet addAction:action2];    [actionSheet addAction:action3];    [actionSheet addAction:action1];    [self presentViewController:actionSheet animated:YES completion:nil];}@end
0 0
原创粉丝点击