iOS开发日记48-详解UIPickerView,48-uipickerview

iOS开发日记48-详解UIPickerView,48-uipickerview

今天博主有一个UIPickerView的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步.

UIPickerView是一个选择器控件,它比UIDatePicker更加通用,它可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观,因此用法非常灵活.

UIPickerView直接继承了UIView,没有继承UIControl,因此,它不能像UIControl那样绑定事件处理方法,UIPickerView的事件处理由其委托对象完成.

    self.viewOfPick=[[UIPickerView
alloc]initWithFrame:CGRectMake(100, 0, 200, [UIScreen
mainScreen].bounds.size.height)];

    _viewOfPick.dataSource=self;

    _viewOfPick.delegate=self;

//pickerView默认选中row为0,无线滚动只是在一开始的时候显示row的中间值,造成无线滚动的假象

    [_viewOfPick selectRow:9 inComponent:0 animated:YES];

//设置pickerView默认选中最后一行

    [_viewOfPick selectRow:9 inComponent:1 animated:YES];

    [self.view addSubview:_viewOfPick];

//类似tableView的cell for row,根据row和component返回字符串显示

– (nullable NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component
__TVOS_PROHIBITED

{

    return @”空”;

}

//类似tableView的didSelect,根据row和component进行具体的传值等操作

– (void)pickerView:(UIPickerView *)pickerView
didSelectRow:(NSInteger)row inComponent:(NSInteger)component
__TVOS_PROHIBITED

{

    NSLog(@”*********%ld,%ld”,(long)component,row);

}

//类似tableView的cell for row,根据row和component返回自定义视图显示

//注意,同时实现返回NSString 和下面这个
返回UIView的方法,只执行返回UIView的方法

-iOS开发日记48-详解UIPickerView,48-uipickerview。 (UIView *)pickerView:(UIPickerView *)pickerView
viewForRow:(NSInteger)row forComponent:(NSInteger)component
reusingView:(nullable UIView *)view __TVOS_PROHIBITED

{

    UIView *blackView=[[UIView alloc]initWithFrame:CGRectMake(0, 0,
10, 10)];

    blackView.backgroundColor=[UIColor blackColor];

    return blackView;

}

//返回pickerView的行高

– (CGFloat)pickerView:(UIPickerView *)pickerView
rowHeightForComponent:(NSInteger)component __TVOS_PROHIBITED

{

    return 40;

}

// returns the number of ‘columns’ to display.component的数量

– (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView

{

    return 2;

}

 

// returns the # of rows in each component..row的数量

– (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component

{

    return 10;

}

 

 

今天博主有一个UIPickerView的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步.
UIPickerV…

一、简介

一、UIPickerView(拾取器)的使用

<<UIPickerView类实现对象,所谓的选择器的看法,即使用一个纺车或老虎机的比喻来显示一个或多个值集。用户可以选择旋转的车轮,使所需的行的值与选择的指

  1、UIPickerView控件生成的表格可以提供滚动的轮盘

之间的对应关系值。UIDatePicker类使用一个自定义子类的UIPickerView显示日期和时间。为了看一个例子,挖掘在时钟应用程序报警窗格添加按钮

 
2、这些表格表面上类似于标准的UITableView控件,但是他们使用的dataSource和delegate方法有细微的差别

<<UIPickerView是一个选择器控件,它比UIDatePicker更加通用,它可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观,因此用法非常灵活

二、UIPickerView常用方法   

<<继承关系:UIPickerView –> UIView
–>UIResponder–>NSObject

   1、获取指定列的行数    –
(NSInteger)numberOfRowsInComponent:(NSInteger)component; 

<<UIPickerView直接继承了UIView,没有继承UIControl,因此,它不能像UIControl那样绑定事件处理方法,UIPickerView的事件处理由其委托对象完成。使用UIPickerView的对象应该遵守UIPickerViewDataSource,UIPickerViewDelegate。

 2、刷新所有列    – (void)reloadAllComponents; 

格式为

 3、刷新指定的列    – (void)reloadComponent:(NSInteger)component; 

1–> 设置数据源(属性的作用

 4、选择一行    – (void)selectRow:(NSInteger)row inComponent:(NSInteger
component    animated:(BOOL)animated;  

[pickerView setDelegate:self]; (这是具体的例子

5、获取指定列当前显示的是第几行    –
(NSInteger)selectedRowInComponent:(NSInteger)component;

@property(nullable,nonatomic,weak) id dataSource;// 设置数据源,
默认是空的 (这是属性的说明

三、UIPickerView常用方法   

二、UIPickerView的属性(属性的顺序与苹果API一致)

 1、dataSource方法     

1–>设置数据源

 1)返回列数        –
(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView   
 

[pickerView setDelegate:self];

 2)返回每一列对应的行数        – (NSInteger)pickerView:(UIPickerView
*)pickerView numberOfRowsInComponent:(NSInteger)component   

@property(nullable,nonatomic,weak) id dataSource;// 设置数据源,
默认是空的,弱引用

 2、delegate方法        

2–>设置代理

1)返回显示的文本        – (NSString *)pickerView:(UIPickerView
*)pickerView titleForRow:(NSInteger)row
forComponent:(NSInteger)component       

[pickerView setDelegate:self];

 2)当某一列选中的行数发生变化时调用          –
(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row
inComponent:(NSInteger)component       

@property(nullable,nonatomic,weak) id delegate; //设置代理,
默认是空的,弱引用

 3) 设置行高        – (CGFloat)pickerView:(UIPickerView *)pickerView
rowHeightForComponent:(NSInteger)component        

3–>设置是否显示UIPickerView中的选中标记,在iOS7之后这个属性没有任何效果

4)设置列宽        – (CGFloat)pickerView:(UIPickerView *)pickerView
widthForComponent:(NSInteger)component        

pickerView.showsSelectionIndicator =YES;

 5)自定义cell        – (UIView *)pickerView:(UIPickerView
*)pickerView viewForRow:(NSInteger)row
forComponent:(NSInteger)component reusingView:(UIView *)view

@property(nonatomic) BOOL showsSelectionIndicator; // 默认是
NO。该属性控制是否显示UIPickerView中的选中标记(以高亮背景作为选中标记)

四、练习   

4–>获取UIPickerView指定列中包含的列表项的数量

 1、使用拾取器做城市选择      

NSInteger row1 =pickerView.numberOfComponents; //获取组键数

1)在工程自带的ViewController的viewDidload加入        UIPickerView
*pickerView = [[UIPickerView alloc]
initWithFrame:CGRectMake(0,self.view.frame.size.height-300, 414,
300)];        pickerView.backgroundColor = [UIColor grayColor];     
      [self.view addSubview:pickerView];     
运行,什么都没有,因为多少段多少行是通过代理方法来设置的    

@property(nonatomic,readonly) NSInteger numberOfComponents;
/从数据源和委托获取并缓存的信息

 
2)让viewController类遵守两个协议,在viewDidLoad方法里给pickerView挂上代理,并在viewController里实现如下两个代理方法

三、UIPickerView的属性方法

//返回列数

1–>获取UIPickerView包含的列数量

– (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{

NSInteger row2 = [pickerView
numberOfRowsInComponent:1];//获取对象下标组键的行数

return 2;

– (NSInteger)numberOfRowsInComponent:(NSInteger)component;

}

2–>
获取UIPickerView包含的指定列中列表项的大小。该方法返回一个CGSize对象。

//返回每一列中的行数

NSLog(@”%@”, NSStringFromCGSize( [self.pickerView
rowSizeForComponent:0])); //打印获取的每列的size;

– (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component {

– rowSizeForComponent:(NSInteger)component;

return 5;

3–> 返回该UIPickerView指定列的列表项所使用的UIView控件。

}

UIView *pickview=[self.pickerView viewForRow:0 forComponent:0];

ca88,运行 选择器里面有两列,每列的数据都是用『?』表示,因为还没有给每列赋值

– (nullable UIView *)viewForRow:(NSInteger)row
forComponent:(NSInteger)component;//返回视图提供的委托通过pickerView:viewForRow:forComponent:reusingView:

3)将课件里面的city.plist文件拖到工程中,在viewDidLoad方法里写入如下代码

如果行或者组件不可见或委托没有实现pickerView:viewForRow:forComponent:reusingView,则为nil

NSString *path = [[NSBundle mainBundle] pathForResource:@”city”
ofType:@”plist”];

4–> 重载所有分区

//声明一个全局变量dataArray

[pickerView reloadAllComponents];//刷新UIPickerView

dataArray = [[NSArray alloc] initWithContentsOfFile:path];

– reloadAllComponents;

4)将代理方法- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component的内容替换成如下内容

5–> 重载某一分区

if (component == 0) {

[pickerView reloadComponent:1];//刷新某一列的数据

return data.count;

– reloadComponent:(NSInteger)component;

}

6–> 设置选中该UIPickerView中指定列的特定列表项

NSInteger selectedRow =  [pickerView
selectedRowInComponent:component];

[pickerView pickerView selectRow:2 inComponent:0animated:YES];
//设置选中的第几列第几行 ,程序一开始运行时就选中该列该行

NSArray *tempArray = data[selectedRow][@”cities”];

– selectRow:(NSInteger)row inComponent:(NSInteger)component
animated:animated; //
将指定的行滚动到中心。该方法设置选中该UIPickerView中指定列的特定列表项。最后一个参数控制是否使用动画。

return tempArray.count;

7–> 返回该UIPickerView指定列中被选中的列表项。

运行 目前还是没有数据,但列数和行数已经做了自动设置

self.row = [self.pickerView
selectedRowInComponent:0];//获取被选中的第一列的行数(这里是为了在给第二列赋值时用的,因此在此之前要理清代理方法的执行顺序,以免造成不必要的bug)

5、给每行设置标题,将如下代理方法写入工程

– (NSInteger)selectedRowInComponent:(NSInteger)component;
//返回选定行。如果没有选中返回-1

//返回每个item中的title

四、UIPickerView的UIPickerViewDataSource

– (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component {

必须实现的方法

if (component == 0) {//第一列

1–>返回显示的列数

NSDictionary *dic = data[row];

– (NSInteger)numberOfComponentsInPickerView:(UIPickerView*)pickerView

NSString *state = dic[@”state”];

{

return state;

return1;// 返回1表明该控件只包含1列

}

}

//返回第一列选择的行的索引

– (NSInteger)numberOfComponentsInPickerView:(UIPickerView
*)pickerView;//UIPickerViewDataSource中定义的方法,该方法的返回值决定该控件包含的列数

NSInteger selectedRow = [pickerView selectedRowInComponent:0];

2–>显示每组键的行数

//取得省级字典

//指定每个表盘上有几行数据

NSDictionary *items = data[selectedRow];

-(NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component

//取得该省下所有的市

{

NSArray *cities = [items objectForKey:@”cities”];

NSInteger result = 0;

NSString *cityName = cities[row];

switch (component) {

return cityName;

case 0:

}

result = self.letter.count;//根据数组的元素个数返回几行数据

运行 每行有标题 但左边的省份变化,右边的城市列表没有跟着变化

break;

6、实现右侧跟着左侧联动

case 1:

//当某一列选中的行数发生变化时调用

result = self.number.count;

– (void)pickerView:(UIPickerView *)pickerView

break;

didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

default:

if (component == 0) {

Copyright @ 2015-2020 ca88 版权所有
网站地图xml地图