2015年07月18日第11天笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yu_4074/article/details/46957303

零碎知识
快捷键
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不用

猜你喜欢

转载自blog.csdn.net/yu_4074/article/details/46957303
今日推荐