IOS之高级控件-拾取器

时间:2023-02-01 17:07:12

5.1 拾取器

5.2 第一视图控制器

5.3 第二视图控制器

5.4 第三视图控制器

5.5 第四视图控制器

5.1 拾取器

IOS之高级控件-拾取器

IOS之高级控件-拾取器

1 创建一个Tab Bar Application

初始化工程

由于我们要自己创建视图控制器,包括第一个试图控制器,所以我们删除:

FirstViewController.h  FirstViewController.m  SecondView.xib

修改MainWindow.xib文件

删除MainWindow.xib文件中自带的View

指定nib文件和视图控制器

IOS之高级控件-拾取器

指定Tab栏按钮图标和title

IOS之高级控件-拾取器

5.2 第一视图控制器

IOS之高级控件-拾取器

DatePickerViewController.h

@interface DatePickerViewController : UIViewController {
IBOutlet UIDatePicker
*datePicker;
}
@property (nonatomic, retain) IBOutlet UIDatePicker
*datePicker;
-(IBAction)onClickButton:(id)sender;

@end

 

日期拾取器,要想显示日期必须定义一个输出口:

@property (nonatomic, retain)  UIDatePicker *datePicker;

定义点击选择按钮的动作事件: -(IBAction)onClickButton:(id)sender;

DatePickerViewController.m

@synthesize datePicker;

-(IBAction)onClickButton:(id)sender {

NSDate
*selected = [datePicker date];
NSString
*message = [[NSString alloc] initWithFormat:@"你选择的日期: %@", selected];
UIAlertView
*alertView = [[UIAlertView alloc] initWithTitle:@"选择日期"
message:message
delegate:nil
cancelButtonTitle:
@"OK"
otherButtonTitles:nil];
[message release];
[alertView show];
[alertView release];


}

 

onClickButton:是按钮事件。

SDate *selected = [datePicker date];可以获取日期拾取器时间。

NSString *message = [[NSString alloc] initWithFormat:@"你选择的日期: %@", selected];

可以把日期格式化输出。

初始化和释放资源

- (void)viewDidLoad {
[super viewDidLoad];
NSDate
*now = [NSDate date];
[datePicker setDate:now animated:YES];
}


- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc. that aren't in use.
}

- (void)viewDidUnload {
[super viewDidUnload];
self.datePicker
= nil;
}


- (void)dealloc {
[datePicker release];
[super dealloc];
}

 

在事件viewDidLoad:初始化日期拾取器。

NSDate *now = [NSDate date]; 获得当前的系统时间。

[datePicker setDate:now animated:YES];

设定日期拾取器的时间,animated:YES是实现动画效果,在初始化时候滚轮滚动到当前日期。

IB中链接输出口和动作

日期拾取器作为输出口,需要通过File's Owner链接到日期拾取器。

还要链接按钮点击时间,从按钮链接到File's Owner。

5.3 第二视图控制器

IOS之高级控件-拾取器

SinglePickerViewController.h

@interface SinglePickerViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {
UIPickerView
*pickerView;
NSArray
*pickerData;
}

@property (nonatomic, retain) IBOutlet UIPickerView
*pickerView;
@property (nonatomic, retain) NSArray
*pickerData;
-(IBAction)onClickButton:(id)sender;

@end

 

拾取器,要想显示必须定义一个输出口: @property (nonatomic, retain)  UIPickerView *picker;

定义点击选择按钮的动作事件: (IBAction)onClickButton:(id)sender;

pickerData保持拾取器的数据。

拾取器的委托

委托是中的方法是事件触发时候回调的方法。

拾取器的委托是实现协议UIPickerViewDelegate。

UIPickerViewDelegate回调方法:

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

是当选择了拾取器时候,根据选择的行返回拾取器的title。

拾取器的数据源

通过UIPickerViewDataSource协议为拾取器提供数据源,其中包括拾取器的行和列的数据,下面的是数据源要求的方法:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 

该方法提供拾取器列的个数,本例子中是1个。

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

该方法提供了拾取器中行数,这里的数组pickerData的长度。

m文件中实现协议

#pragma mark--委托协议方法
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [pickerData objectAtIndex:row];
}

#pragma mark--数据源协议方法
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component {
return [pickerData count];
}

 

初始化和按钮事件处理

@synthesize pickerView;
@synthesize pickerData;

- (void)viewDidLoad {

NSArray
*array = [[NSArray alloc] initWithObjects:@"欧洲",
@"南美", @"非洲", @"北美",
@"亚洲", @"大洋洲", nil];
self.pickerData
= array;
[array release];
}

-(IBAction)onClickButton:(id)sender {

NSInteger row
= [pickerView selectedRowInComponent:0];
NSString
*selected = [pickerData objectAtIndex:row];
NSString
*title = [[NSString alloc] initWithFormat:@"你选择了 %@!", selected];

UIAlertView
*alert = [[UIAlertView alloc] initWithTitle:title
message:
@"谢谢你的选择."
delegate:nil
cancelButtonTitle:
@"Ok"
otherButtonTitles:nil];
[title release];
[alert show];
[alert release];

}

 

NSInteger row = [picker selectedRowInComponent:0]; 获得第一列的选择中的行号。

NSString *selected = [pickerData objectAtIndex:row]; 通过行号获得选中的数据。

释放资源 

- (void)viewDidUnload {
[super viewDidUnload];
self.pickerView
= nil;
self.pickerData
= nil;
}


- (void)dealloc {
[pickerView release];
[pickerData release];
[super dealloc];
}

 

IB中链接输出口和动作

拾取器的输出口,需要File‘s Owner与委托和数据源链接。

拾取器的委托和数据源输出口,需要File‘s Owner与委托和数据源链接。

按钮动作onClickButton需要链接到File‘s Owner。

5.4 第三视图控制器

IOS之高级控件-拾取器

DoublePickerViewController.h

@interface DoublePickerViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {
UIPickerView
*pickerView;
NSArray
*pickerData1;
NSArray
*pickerData2;
}

@property (nonatomic,retain) IBOutlet UIPickerView
*pickerView;
@property (nonatomic,retain) NSArray
*pickerData1;
@property (nonatomic,retain) NSArray
*pickerData2;

-(IBAction)onClick:(id)sender;

@end

 

拾取器,要想显示必须定义一个输出口:

@property (nonatomic, retain)  UIPickerView *picker;

定义点击选择按钮的动作事件:

-(IBAction)onClick:(id)sender;

@property (nonatomic, retain)  NSArray  *pickerData1;

@property (nonatomic, retain)  NSArray  *pickerData2;

保持拾取器两个列中的数据。

拾取器的委托

委托是中的方法是事件触发时候回调的方法。

拾取器的委托是实现协议UIPickerViewDelegate。

UIPickerViewDelegate回调方法:

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

是当选择了拾取器时候,根据选择的行返回拾取器的title。

拾取器的数据源

通过UIPickerViewDataSource协议为拾取器提供数据源,其中包括拾取器的行和列的数据,下面的是数据源要求的方法:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 

该方法提供拾取器列的个数,本例子中是2个。

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

该方法提供了拾取器中行数,这里的数组pickerData的长度。

m文件中实现协议

#pragma mark--委托协议方法
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component {
if (component == 0) { //选择了第一列
return [pickerData1 objectAtIndex:row];
}
else {//选择了第二列
return [pickerData2 objectAtIndex:row];
}
}

#pragma mark--数据源协议方法
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 2;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component {
if (component == 0) { //选择了第一列
return [pickerData1 count];
}
else {//选择了第二列
return [pickerData2 count];
}
}

 

component == 0代表选择的第一列即“洲”。如果component == 1代表选择的是第二列即“体育项目”。

这两个列直接没有关联关系,即你选择了前面和选择了后面没有关系,不会联动。

初始化处理

- (void)viewDidLoad {
NSArray
*array1 = [[NSArray alloc] initWithObjects:@"欧洲",
@"南美", @"非洲", @"北美",
@"亚洲", @"大洋洲", nil];
self.pickerData1
= array1;
NSArray
*array2 = [[NSArray alloc] initWithObjects:@"足球",
@"篮球", @"羽毛球", @"乒乓球", nil];
self.pickerData2
= array2;

[array1 release];
[array2 release];
}

 

按钮事件处理

-(IBAction)onClick:(id)sender {

NSInteger row1
= [pickerView selectedRowInComponent:0];
NSInteger row2
= [pickerView selectedRowInComponent:1];
NSString
*selected1 = [pickerData1 objectAtIndex:row1];
NSString
*selected2 = [pickerData2 objectAtIndex:row2];

NSString
*title = [[NSString alloc] initWithFormat:@"你选择了 %@的%@项目!",
selected1,selected2];
UIAlertView
*alert = [[UIAlertView alloc] initWithTitle:title
message:
@"谢谢你的选择."
delegate:nil
cancelButtonTitle:
@"Ok"
otherButtonTitles:nil];
[selected1 release];
[selected2 release];
[title release];
[alert show];
[alert release];
}

 

释放资源

- (void)viewDidUnload {
[super viewDidUnload];
self.pickerData1
= nil;
self.pickerData2
= nil;
self.pickerView
= nil;
}


- (void)dealloc {
[pickerData1 release];
[pickerData2 release];
[pickerView release];
[super dealloc];
}

 

IB中链接输出口和动作

拾取器的输出口,需要File‘s Owner与委托和数据源链接。

拾取器的委托和数据源输出口,需要File‘s Owner与委托和数据源链接。

按钮动作onClickButton需要链接到File‘s Owner。

5.5 第四视图控制器

IOS之高级控件-拾取器

DependentViewController.h

@interface DependentPickerViewController : UIViewController <UIPickerViewDelegate,UIPickerViewDataSource>{
NSDictionary
*data;
NSArray
*pickerData1;
NSArray
*pickerData2;
UIPickerView
*pickerView;
}

@property (nonatomic, retain) NSDictionary
*data;
@property (nonatomic, retain) NSArray
*pickerData1;
@property (nonatomic, retain) NSArray
*pickerData2;
@property (nonatomic, retain) IBOutlet UIPickerView
*pickerView;

-(IBAction)onClick:(id)sender;

@end

 

拾取器,要想显示必须定义一个输出口: @property (nonatomic, retain)  UIPickerView *pickerView;

定义点击选择按钮的动作事件: -(IBAction)onClickButton:(id)sender;

@property (nonatomic, retain)  NSDictionary  *data; 保存所有数据

@property (nonatomic, retain)  NSArray  *pickerData1; 保存第一列的数据

@property (nonatomic, retain)  NSArray  *pickerData2; 保持第二列的数据

m文件中的初始化方法

@synthesize data;
@synthesize pickerData1;
@synthesize pickerData2;
@synthesize pickerView;

- (void)viewDidLoad {

NSBundle
*bundle = [NSBundle mainBundle];
NSString
*plistPath = [bundle pathForResource:@"足球队dictionary"
ofType:
@"plist"];
NSDictionary
*dict = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.data
= dict;
[dict release];

NSArray
*col1 = [self.data allKeys];
NSArray
*sorted = [col1 sortedArrayUsingSelector:@selector(compare:)];
self.pickerData1
= sorted;

NSString
*selectCol1 = [self.pickerData1 objectAtIndex:0];
NSArray
*col2 = [self.data objectForKey:selectCol1];

self.pickerData2
= col2;

}

 

NSBundle *bundle = [NSBundle mainBundle];

NSString *plistPath = [bundle pathForResource:@"足球队dictionary" ofType:@"plist"];

NSDictionary *dict = [[NSDictionary alloc] nitWithContentsOfFile:plistPath];

这几行代码是从statedictionary.plist属性列表文件中读取到NSDictionary对象中。

NSArray *sorted = [col1 sortedArrayUsingSelector:@selector(compare:)]; 对数据排序。

在Xcode中创建属性列表文件
IOS之高级控件-拾取器

编辑属性列表文件

IOS之高级控件-拾取器

m中的按钮点击事件

-(IBAction)onClick:(id)sender {

NSInteger row1
= [pickerView selectedRowInComponent:0];
NSInteger row2
= [pickerView selectedRowInComponent:1];
NSString
*selected1 = [pickerData1 objectAtIndex:row1];
NSString
*selected2 = [pickerData2 objectAtIndex:row2];

NSString
*title = [[NSString alloc] initWithFormat:@"你选择了 %@的%@项目!",
selected1,selected2];
UIAlertView
*alert = [[UIAlertView alloc] initWithTitle:title
message:
@"谢谢你的选择."
delegate:nil
cancelButtonTitle:
@"Ok"
otherButtonTitles:nil];
[selected1 release];
[selected2 release];
[title release];
[alert show];
[alert release];
}

 

实现委托方法

#pragma mark--委托协议方法
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component {
if (component == 0) { //选择了第一列
return [pickerData1 objectAtIndex:row];
}
else {//选择了第二列
return [pickerData2 objectAtIndex:row];
}
}


- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row
inComponent:(NSInteger)component {
if (component == 0) {
NSString
*selectCol1 = [pickerData1 objectAtIndex:row];
NSArray
*col2 = [self.data objectForKey:selectCol1];
pickerData2
= col2;
//[self.pickerView selectRow:0 inComponent:1 animated:YES];
[self.pickerView reloadComponent:1];
}
}

 

委托方法是实现拾取器控件两个轮互动关键:

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

在该方法中通过下面语句重新加载拾取器: [self.pickerView reloadComponent:1];

实现数据源方法

#pragma mark--数据源协议方法
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 2;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component {
if (component == 0) { //选择了第一列
return [pickerData1 count];
}
else {//选择了第二列
return [pickerData2 count];
}
}

 

释放资源

- (void)viewDidUnload {
[super viewDidUnload];
self.data
= nil;
self.pickerData1
= nil;
self.pickerData2
= nil;
self.pickerView
= nil;
}


- (void)dealloc {
[pickerData1 release];
[pickerData2 release];
[data release];
[pickerView release];
[super dealloc];
}

 

IB中链接输出口和动作

拾取器的输出口,需要File‘s Owner与委托和数据源链接。

拾取器的委托和数据源输出口,需要File‘s Owner与委托和数据源链接。

按钮动作onClickButton需要链接到File‘s Owner。

注:

1 本教程是基于关东升老师的教程

2 基于黑苹果10.6.8和xcode4.2

3 本人初学,有什么不对的望指教

4 教程会随着本人学习,持续更新

5 教程是本人从word笔记中拷贝出来了,所以格式请见谅