Xcode 选择器 Picker 的应用

Picker估计大家都不陌生了。经常会用到。今天来做一个比较简单的介绍吧。

1.最简单的Picker:只有一个Picker,根据数据源显示内容,并捕捉到选择的项目。

2.相关的Picker:两个Picker,都有数据源,但是第二个Picker的数据源会根据第一个不同选择而变化,最后捕捉到两个Picker的选项。


废话不多说了。开始。

1.新建Picker工程,模板为Empty Application。

2.根据我之前的博文建立一个标签栏的多视图界面。

两个视图分别为SinglePicker和DoublePicker。文件结构如图:

Xcode <wbr>选择器 <wbr>Picker <wbr>的应用

这样方便我们建立两个不同的picker。不会建立的可以参考http://blog.sina.com.cn/s/blog_6bd25bef0100vjyg.html

3.布局

SinglePicker和DoublePicker都一样,如图:

Xcode <wbr>选择器 <wbr>Picker <wbr>的应用

4.编写协议方法:

picker的实现是有自己协议的:<UIPickerViewDelegate,UIPickerViewDataSource>

对于SinglePicker,我们这样写:

对于SinglePicker.h


#import <UIKit/UIKit.h>


@interface SinglePicker : UIViewController<UIPickerViewDelegate,UIPickerViewDataSource>{

    NSArray *data;

    UIPickerView *piker;

}

@property (strong, nonatomic) NSArray *data;//数据源

@property (strong, nonatomic) IBOutlet UIPickerView *picker;


- (IBAction)choose;//捕捉

@end


对于SinglePicker.m:


#import "SinglePicker.h"


@implementation SinglePicker


@synthesize picker;

@synthesize data;


- (IBAction)choose{

    NSInteger row = [picker selectedRowInComponent:0];

    NSLog(@"%d",row);

    NSString *selected = [data objectAtIndex:row];

    NSString *msg = [[NSString alloc]initWithFormat:@"You selected %@", selected];

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"What Did You Selected?" message:msgdelegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];

    [alert show];

}

……

- (void)viewDidLoad

{

    data = [[NSArray alloc]initWithObjects:@"China",@"America",@"Japan",@"Rusia", nil];

    [super viewDidLoad];

    // Do any additional setup after loading the view from its nib.

}

……

#pragma mark -

#pragma mark Picker Data Soucrce Methods

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

    return 1;//Picker里有几个竖的栏目就返回几,不要拖动几个Picker哦,一个足以。如果必须要几个Picker来实现某些过功能,那你就要额外创建一些文件来完成委托了。毕竟疑问类里就只能委托一个Picker

}

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

    return [data count];//picker中的选项有几个

}


#pragma mark -

#pragma mark Picker Data Delegate Methods;

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

    return [data objectAtIndex:row];//返回每个选项要显示的内容

}


而对于DoublePicker.h


#import <UIKit/UIKit.h>


@interface DoublePicker : UIViewController{

    UIPickerView *doublePicker;

    NSArray *country;

    NSArray *city;

    NSArray *cities;

}

@property (strong, nonatomic) IBOutlet UIPickerView *doublePicker;

@property (strong, nonatomic) NSArray *country;

@property (strong, nonatomic) NSArray *city;

@property (strong, nonatomic) NSArray *cities;

- (IBAction)choose;


@end


对DoublePicker.m的边写就相对复杂一点了。可以看一下注释:



#import "DoublePicker.h"


@implementation DoublePicker


@synthesize doublePicker;

@synthesize country;

@synthesize city;

@synthesize cities;



- (IBAction)choose{

    NSInteger row1 = [doublePicker selectedRowInComponent:0];

    NSLog(@"%d",row1);

    NSString *selectCountry = [country objectAtIndex:row1];

    NSUInteger row2 = [doublePicker selectedRowInComponent:1];

    NSString *selectCity = [[cities objectAtIndex:row1]objectAtIndex:row2];

    NSString *msg = [[NSString alloc]initWithFormat:@"You selected %@ %@", selectCountry, selectCity];

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"What Did You Selected?" message:msgdelegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];

    [alert show];

}

……

- (void)viewDidLoad

{

    country =[[NSArray alloc]initWithObjects:@"China",@"America", nil];

    NSArray *China = [[NSArray alloc] initWithObjects:@"Guangzhou",@"Beijing",@"Shanghai", nil];

    NSArray *America = [[NSArray alloc]initWithObjects:@"NewYork",@"Waston", nil];

    cities = [[NSArray alloc] initWithObjects:China,America, nil];

    city = China;

    [super viewDidLoad];

    // Do any additional setup after loading the view from its nib.

}

……

#pragma mark -

#pragma mark Picker Data Source Methods

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView

{

    return 2;

}

- (NSInteger)pickerView:(UIPickerView *)pickerView  

numberOfRowsInComponent:(NSInteger)component

{

    if (component == 0)

        return [self.country count];

    

    return [self.city count];

}


#pragma mark Picker Delegate Methods

- (NSString *)pickerView:(UIPickerView *)pickerView 

             titleForRow:(NSInteger)row 

            forComponent:(NSInteger)component

{

    if (component == 0)

        return [self.country objectAtIndex:row];

    if (component ==1)

        return [self.city objectAtIndex:row];//先默认显示第二个相关picker

}


//注意这里

- (void)pickerView:(UIPickerView*)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{

    //一旦第一个Picker的内容改变,马上检测,更新第二个Picker中的数据源,最后重新加载显示第二个Picker,不然即使更换数据源也是看不到的,虽然实际上已经改变了。

    if (component == 0) {

        city = [cities objectAtIndex:[doublePicker selectedRowInComponent:0]];

        [doublePicker selectRow:0 inComponent:1 animated:YES];

        [doublePicker reloadComponent:1];

    }

}


这解释一下,同一个Picker中不同列是使用不同的componet来区分的,而不同的行就是用row来区分啦。


5.连接:

SinglePicker和DoublePicker连接方式一样,都是在xib文件里,按住右键,同时拖动Picker到File’s Owner两次把Delegate和data source连上。 按住右键,拖动Button到File’s Owner把choose方法连上。

6.运行:

Xcode <wbr>选择器 <wbr>Picker <wbr>的应用
Xcode <wbr>选择器 <wbr>Picker <wbr>的应用
Xcode <wbr>选择器 <wbr>Picker <wbr>的应用
Xcode <wbr>选择器 <wbr>Picker <wbr>的应用



【原文:http://blog.sina.com.cn/s/blog_6bd25bef0100wt7r.html】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值