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
- IOS学习日志(Controller)1.2
- IOS学习日志(Controller)1.1
- IOS学习日志(Controller)1.3
- IOS学习日志(Controller)1.4
- IOS学习日志(Controller)1.5
- IOS学习日志(Controller)1.6
- IOS学习日志(Controller)1.7
- IOS学习日志(Controller)1.8
- IOS学习日志(Controller)1.9
- IOS学习日志(OC)1.2
- iOS学习- 05 Navigation Controller
- iOS 5 Storyboard 学习之 Tabbar Controller,Navigation Controller (1)
- iOS 5 Storyboard 学习之 Tabbar Controller,Navigation Controller (3)
- iOS学习日志
- IOS学习——Navigation Controller
- iOS学习- 05 Tab Bar Controller
- 日志AOP拦截Controller
- controller日志AOP处理
- 微软ping程序源代码完整版
- maven for package--system error solution
- ubuntu /etc/profile和/etc/environment的比较
- 《苏东坡传》读后感
- forin用法
- IOS学习日志(Controller)1.2
- maven offline jar for build
- python 中模块的使用
- java14.语言进阶------本地文件操作---文件属性的读取、设置
- ubuntu12.04设置网桥
- 理论: 图论(5): 无权图的最短路径
- 《oranges:一个操作系统的实现》阅读笔记
- POJ1064 Cable master(二分)
- android5.1源码中加全局变量