IPhone开发笔记(3) 使用PickerView
Author: admin
Picker View需要两个接口:DataSource和Delegate。
在定义接口的地方要有如下定义:
一个类必须至少实现下列方法:
@interface SingleComponentPickerViewController : UIViewController
<UIPickerViewDelegate, UIPickerViewDataSource>
#pragma mark -
#pragma mark Picker Data Source Methods
- (NSInteger) numberOfComponentsInPickerView: (UIPickerView *) pickerView
{
return 1;
}
- (NSInteger) pickerView: (UIPickerView *)pickerView
numberOfRowsInComponent: (NSInteger) component
{
return [pickerData count];
}
#pragma mark Picker Delegate Methods
- (NSString *) pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger) row
forComponent:(NSInteger) component{
return [pickerData objectAtIndex:row];
}
其中Data Source提供了数据,而Delegate则实际获取数据。
如果要接收某个Component被选择的消息,则要实现一个delegate方法:
- (void) pickerView:(UIPickerView *) pickerView
didSelectRow: (NSInteger) row
inComponent: (NSInteger) component{
if (component == kStateComponent) {
NSString *selectedState = [self.states objectAtIndex:row];
NSArray *array = [stateZips objectForKey:selectedState];
self.zips = array;
[picker selectRow:0 inComponent: kZipComponent animated:YES];
[picker reloadComponent:kZipComponent];
}
}
另外,下面的例子简要说明如何使用NSDictionary
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"statedictionary" ofType:@"plist"];
NSDictionary *dictionary = [[NSDictionary alloc]
initWithContentsOfFile:plistPath];
self.stateZips = dictionary;
[dictionary release];
NSArray *components = [self.stateZips allKeys];
NSArray *sorted = [components sortedArrayUsingSelector:@selector(compare:)];
self.states = sorted;
NSString *selectedState = [self.states objectAtIndex:0];
NSArray *array = [stateZips objectForKey:selectedState];
self.zips = array;
更改每个组件的宽度也可以用代理实现:
- (CGFloat) pickerView: (UIPickerView *) pickerView
widthForComponent: (NSInteger) component
{
if(component == kZipComponent)
return 90;
return 200;
}
注意到前面我们在- (NSString *) pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger) row forComponent:( NSInteger) component 代理方法中,实现的是返回一个NSString。如果要显示图片,则需要实现另一个代理方法
- (UIView *) pickerView : (UIPickerView *)pickerView viewForRow:(NSInteger) row forComponent (NSInteger) component
该方法返回一个View对象。可以用下面方法创建Image View
UIImage *bar = [UIImage imageNamed:@"filename"];
UIImageView *x = [[UIImageView alloc] initWithImage:bar];
最后,注意一个方法,可以用以下方法动态为不同名字的field设置值:
[self setValue:value forKey:fieldName]
Field name 可以是字符串,同时也是变量名称。很动态哦。