零碎知识
快捷键
1.自己百度
2.有多少字典就有多少个模型
3.根类型决定控制器要定义的存数据的类型
4.从文件获取数据称作“解析”
5.导入头文件的快捷键
6.插件整理代码格式
7.pickView的数据源方法
8.标题forRow,视图forRow
9.连一个线,自动生成代码后,复制几份以备其他xib控件使用 修改后反连线
10.loadNibName mainBundle 返回的是数组
11.command + shift(option) + b 自动导入头文件
12.一个xib类文件一般包含两个东西:控件+数据模型
13.更新frames 还有一个更新约束的选项
14.有个返回pickView的高度代理方法
15.选择–拿值
16.build 和 run 的区别
17.NSString path = [[NSBundle mainBundle] pathForResource:@”provinces” ofType:nil];
18.当前组的选中的值的索引 selectedRowInComponent
19.用数组点不出 属性:可能原因数组元素的类型是id,这时候用[]去调用
20.两组有关系的时候,选中好一组后,必须代码去刷新它关联的组,否则不会自动刷新;这件事放在didSelectRow的代理方法去完成
21.刷新组:[pickerView reloadComponent];
22.关联的两组,同时滚动的时候会有bug,在左下角的加号设置全局断点,会跳到出错位置
23.bug信息:数组越界:两组信息不配套
24.控件一般布局:上左右高
25.想监听某个控件,首先思考有没有对应的代理方法
2015年07月18日15:33:18
1.文本框的一些监听事件,弹出不同的输入视图,设置文本框的编辑属性
2.在item里点出action赋值
3.在.h里定义代理协议方法,变量
4.在.m里去让代理去调用代理方法
5.在控制器里指定代理,并实现代理。
6.封装就是一个松耦合
7.一个block就对应一个方法,一个代理可以对于多个方法。
8.什么时候用block什么时候用代理:两个类之间够不着了,就写个代理连接下
9.定义全局控件变量一般用weak
10.Bundle display name 改程序的名称
11.Bundble version 版本号最好改成和SVN服务器的生成的版本号一致,以便有bug的时候好找
12.点击项目出现的界面就是info.plist对应的的,在界面修改的时候,能选就选,别手写改
13.版本号:带浮点是给用户看的(visiion)而build是给自己看的
14.引导页:通过版本号判断来决定是否显示引导页(添加了什么新功能)
15.获取版本号:[NSBundle mainBundle].infoDictionary 获取plist文件字典,然后通过键属性(先用xml打开去找这个键名)获得。
16.怎么设置类前缀:选中项目,在右边的面板里Class prefix里先设置(只能再设置后创建的文件有,之前的只能手动去改)
17.类前缀:自定义的一般是三个字符组成的;两个字符的是苹果自己保留用的
18.文件重名在xCode是不被允许的。为了避免,就有了类前缀来区分。防止两个框架里类名可能重名的问题
19.真正的类怎么区别?OC里没有的类的概念
2015年07月19日07:56:44
课堂代码分析
一、点餐系统
1.UI设计
1)顶部菜单条:UIView
2)菜单条上又一个随机按钮,一个标题Label
3)中间一个PickerView
4)下面6个Lbale:水果,主菜,饮料以及对应的三个待定Label
2.代码分析
1)将要操作的控件进行连线
@property (nonatomic,weak) IBOutlet UIPickerView *pickerView;
@property(nonatomic,strong) NSArray *food;
2)加载数据
-(NSArray *)foods
3)设置界面启动后初始数据
for(int commponent = 0;componment<self.foods.count;++component)
{
[self pickerView:nil didSelectRow:0 inComponent:component];
}
4)设置数据源和代理
可以UI设计的时候完成
5)实现数据源方法
返回列
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return self.foods.count;
}
返回行
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
NSArray *subfoods = self.foods[component];
return subfoods.count;
}
6)实现代理方法
返回行文本
-(NSString *)pickerView:(UIPicerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
retutn self.foods[component][row];
}
设置选中某列某行后的操作
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
if(component == 0)
{
self.fruitLabel.text = self.foods[component][row];
}
else if
{
self.mainLabel.text = self.foods[component][row];
}
esle if
{
self.drinnkLabel.text = self.food[component][row];
}
}
7)实现随机按钮的事件处理方法
-(IBAction)randomFood
{
for(int component = 0; component < self.foods.count; ++component)
{
NSUInteger count = [self.foods[component] count];
//获取在当前列选中的行号
NSUInteger oldrow = [self.pickerView selectedRowInComponent:component];
NSUInteger row = oldRow;
//保证和上次不一样
while(row == oldRow)
{
row = arc4random()%count;
}
//让pickView主动选中第component列的第row行
[self.pickerView selectRow:row inComponent:component animated:YES];
//设置选中某列某行后的操作
[self pickerView:nil didSelectRow:row inComponent:component];
}
}
知识总结:
)返回列(数据方法,实现)
2)返回行(数据方法,实现)
3)返回行文本(代理方法,实现)
4)设置选中后的操作(代理方法,实现)
5)获取在当前列已经选中的行号(控件对象 方法,调用)
6)主动选中第component列的第row行(控件对象 方法,调用)
7)生成随机数//row = arc4random()%count;
二、国旗选择
和点菜系统的区别:用一列显示两列的内容
1.UI设计
1)自定义pickerView行视图样式实现一列显示两列的内容
2)视图继承UIView
3)自定义视图:一个Label,一个UIImageView
4)设置约束
UIImageView:宽固定,上下右固定
Label:宽固定,上下左固定
5)面板设置关联的xib类
2.代码分析
1.定义xib类
1)引入模型类属性
2)定义连线控件属性
3)定义一个从xib文件加载控件的类方法
4)实现类方法,重写set数据模型,给控件赋值
2.控制器
-(void)viewDidLoad
{
[super viewDidLoad];
//创建pickerView,默认有宽高
UIPickerView *pickerView = [[UIPickerView alloc] init];
[self.view addSubview:pickerView];
pickerView.delegate = self;
pickerView.dataSource = self;
}
//返回列
-(NSInteger)numberOfComponentsInPickrView:(UIPickerView *)pickerView
{
return 1;
}
//返回行
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return self.flags.count;
}
//返回pickerView视图的样式
-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
//ios6 要判断view是否为空,为空再创建
FLagView *flagView = [FlagView flag];
flagView.flag = self.flags[row];
return flagView.flag;
}
//设置pickerView的高度
-(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
return 60;
}
知识总结
1)pickerView的创建
2)设置pickerView的高度
3)返回一个行视图UIView类型的
4)判断是否为空的简写(感叹号,取反) if(!_flags){}
三、键盘处理:根据不同的文本框,弹出不同样式的输入视图
1.UI设计
1)添加两个文本框
2)辅助控件xib文件
a:一个ToolBar控件
b:三个item控件,一个FlexibleSapce控件
2.代码分析
===xib代码设计
1)三个item控件连线属性
2)加载控件的类方法
3)定义完成文本框选择的工作代理协议(监听按钮在xib类,操作的文本框在控制器类,于是就有了代理来实现这两个类之间的通信)
4)定义代理变量
5)实现监听方法(用代理调用控制器类实现的方法),实现类方法(返回控件对象实体)
===控制器
1)属性设计
两个文本框
一个文本框数组:用来间接区别不同文本框
一个输入辅助控件对象(上一个,下一个,完成)
一个记录当前使用的文本框的数组索引
2)代码实现分析
在didViewLoad里
1.监听文本框点击,监听辅助视图的点击:引入2者的代理;并指定代理
<UITextFieldDelegate,HMToolBarDelegate>;
self.birth.delegate = self;
2.监听datePicker,没有代理协议,但是它继承自
UIControl(UIControl继承UIView),于是可以向它指定一个自定义的方法
UIDatePicker *datePicker = [[UIDatePicker alloc] init];
datePicer.locale = [[NSLoacle alloc] initWithLocaleIndentifier:@"zh_CN"];//让它显示中文
datePicker.datePickerMode = UIDatePickerModeDate;//设置时间的样式
//监听自身值是否发生改变,改变则去执行指定方法
[datePicker addTarget:self action:@selector(timeChange:) forControlEvents:UIControlEventValueChanged];
3.键盘是文本框的默认输入视图,也可以自定义;于是可以重新设置文本框的输入视图
self.birth.inputView = datePicker;
4.文本框不仅有输入视图,还有输入视图对应的辅助视图,也可以自定义xib文件
HMToolBar *toolBar = [HMToolBar toolBar];
self.toolBar = toorBar;
toorBar.toolBarDelegate = self;
self.birth.inputAccessoryView = toolBar;
5.一个文本框数组:用来间接区别不同文本框
self.textFields = @[self.birth,self.city,self.time];
其他方法
1.实现辅助视图的代理方法:用一个switch利用按钮的枚举类型做出不同判断
-(void)toorBar:(HMToolBar *)toolBar withButtonType:(HMToolBarButtonType)type
{
switch(type)
{
case:HMToolBarButtonTypePre:
[self.textFields[self.textIndex -1 ] becomeFirstResponder];//文本框获取焦点成为第一响应者
break;
case:HMToolBarButtonTypeNext:
[self.textFields[self.textIndex + 1] becomeFirstResponder];
break;
case:HMToolBarButtonTypeDone:
[self.view endEditing:YES];//收起键盘
break;
default:
break;
}
}
2.实现datePicker值改变后要执行的方法
-(void)timeChange:(UIDatePicket *)sender
{
NSDate* date = sender.date;
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd";
NSString *time = [formatter stringFromDate:date];
self.birth.text = time;
}
3.实现让文本框文本不能改变的代理方法,但是这个方法不能阻止文本框被赋值,依然会显示光标
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)
{
return NO;
}
4.文本框开始编辑的时候调用,就是文本框获取到光标的时候
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
self.textIndex = [self.textFields indexOfObject:textField];//获取当前文本框的索引
if(self.textIndex == 0 )
{
self.tooBar.preButton.enabled = NO;
self.tooBar.nextButton.enabled = YES;
}
else if
{
self.tooBar.preButton.enabled = YES;
self.tooBar.nextButton.enabled = NO;
}
else
{
self.toolBar.nextButton.enabled = YES;
self.toolBar.preButton.enabled = YES;
}
}
知识总结
方法:
1.监听辅助控件的item的点击(实现自定义的代理方法)
2.监听文本框是否开始编辑 (文本框自带的代理方法)
3.让文本框不可编辑(文本框自带的代理方法)
4.监听datePicker值有没有改变 (添加处理值改变(UIControlEventValueChanged)的自定义方法)
属性
1.datePicker的local、datePickerMode
2.textField的inputView、inputAccessoryView
补充:
1.关于文本框的代理方法
1)是否允许用户编辑
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
return NO;
}
2)文本框开始编辑的时候调用
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
}
3)是否允许文本框结束编辑
-(BOOL)textFieldShouldEditing:(UITextField *)textField
{
}
4)文本框结束编辑的时候调用
-(void)textFieldDidEndEditing:(UITextField *)textField
{
}
2.用Block实现代理流程
1)首先在委托类.h里定义一个Block
@property(nonatomic,copy)void (^clickBlock)(HMToolBarButtonType type);
2) 然后在委托类的.m里的控件监听方法里去用
-(IBAction)preClikc:(id)sender
{
if(self.clickBlock)
{
self.clickBlock(HMToolBarButtonTypePre);
}
}
3) 去“代理”类去实现(这个“代理”类就是,就是创建委托类对象的那个类文件)
a:首先创建一个委托对象
b:用这个委托对象点出这个Block属性
c:创建一个实现预期功能的代码块赋给这个属性就OK了。
4)代理和Block在这方面能力的区别
a:代理可以对应多个方法的实现,Block只能对应一个方法
b:代理要定义一个代理协议,Block不用