最近,上课讲解了日期选择器和普通数据选择器的使用,上课讲解的案例是假期学生去向登记,该项目有一定的实际意义,可以在后期的教学中不断的有话,并和数据库老师去协调一些,能不能数据库中解决一下数据的问题,当然这部分知识现在暂时还不需要。
目前,我的课堂教学上已经完成了离校日期、返校日期、地域选择等内容的输入设计,前面两个难度不大,地域选择的处理上,对于初学者有如下问题要解决:
1、解析plist文件;
2、加载数据到数据选择控件,使用PickerView控件的属性和方法:(1)使用何种协议;(2)数据源属性和代理属性;(3)设置组件的个数(4)返回某列数据的行数(5)设置每行的文本显示(6)数据联动
3.在实现(4)、(5)的功能时提炼一个loadData方法
程序的源码如下:
//
//ViewController.m
//testPicker
//
//Created by dxx on 2016/10/8.
//Copyright © 2016年tyh. All rights reserved.
//
#import"ViewController.h"
@interfaceViewController()
//解析plist文件并将结果存储到字典中?为什么用字典
@property(nonatomic,strong)NSDictionary* cityNames;
//省
@property(nonatomic,strong)NSArray* provinces;
//市
@property(nonatomic,strong)NSArray* cities;
@end
@implementationViewController
//获取数据,解析plist文件
-(NSDictionary*)cityNames{
if(_cityNames==nil) {
NSString* path=[[NSBundlemainBundle]pathForResource:@"cityData"ofType:@"plist"];
_cityNames=[NSDictionarydictionaryWithContentsOfFile:path];
}
return_cityNames;
}
-(NSArray*)provinces{
if(_provinces==nil) {
_provinces=[self.cityNamesallKeys];
}
return_provinces;
}
//加载数据到组件
//1.设置组件的个数
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView*)pickerView{
return2;
}
//2.返回某列数据的行数
-(NSInteger)pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component{
if(component==0) {
return self.provinces.count;
}else{
[selfloadData:pickerView];
return self.cities.count;
}
}
//3.设置每行的文本显示
-(NSString*)pickerView:(UIPickerView*)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
if(component==0) {
return self.provinces[row];
}
else{
[self loadData:pickerView];
return self.cities[row];
}
}
//4.以上问题的解决都涉及到加载数据问题,写loadData方法
-(void)loadData:(UIPickerView*)pickerView{
NSIntegerselRow=[pickerViewselectedRowInComponent:0];
NSString*key=self.provinces[selRow];
self.cities=[self.cityNamesvalueForKey:key];
}
//5.数据联动
-(void)pickerView:(UIPickerView*)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
if(component==0) {
[pickerViewreloadComponent:1];
[pickerViewselectRow:0inComponent:1animated:YES];
}
}
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
plist文件结构如下: