前幾天寫項目遇到選擇數據的情況,所以封裝了一下三種選擇器(單行數據選擇,日期選擇,城市選擇),都以AlterController的方式Model到控制器,原理是和PickerView是一樣的,城市選擇涉及到了三級聯動,同時也寫了三級聯動中數組越界的問題(當然如果使用模型的話,更容易避免).
歡迎有興趣的同學可以聯系我郵箱liuqinghe66@gmail.com與我討論
Github.Demo地址 : https://github.com/TynnPassBy/TynnSelector
下載后拖入項目,導入一個頭文件即可:
#import "AlterController.h"
一.單行選擇效果:
singLine.gif
單行效果實現代碼:
1.創建需要彈出的AlterController
AlterController *pickerView = [[AlterController alloc]initWithTitle:@"選擇單行數據" type:kTypeOfSingleLine];
//設置數據
pickerView.dataArray = @[@"波多野結衣",@"天海翼",@"小澤瑪利亞",@"大橋未久"];
//設置代理
pickerView.delegate = self;
[self presentViewController:pickerView animated:YES completion:nil];
//selectedBtn是一個定義的屬性,用于標記你所點擊的按鈕是哪個
self.selectedBtn = sender;
2.實現代理方法
-(void)getResultFromPickView:(NSString *)result{
[self.selectedBtn setTitle:result forState:UIControlStateNormal];
}
提示:
- 創建AlterController時type類型要按照需求去填寫,不同數據對應的type值也不一樣,要當心填錯
二.日期選擇效果:
date.gif
日期選擇代碼:
1.創建需要彈出的AlterController
AlterController *pickerView = [[AlterController alloc]initWithTitle:@"選擇日期" type:kTypeOfDate];
pickerView.dataArray = [self getDateData];
pickerView.delegate = self;
[self presentViewController:pickerView animated:YES completion:nil];
//標記所選按鈕
self.selectedBtn = sender;
2.加載日期數據
//獲取日期數據
- (NSArray *)getDateData{
NSInteger year = 1900;
NSMutableArray *yearArray = [NSMutableArray array];
for (NSInteger i = 0; i<130; i++) {
NSString *newYear = [NSString stringWithFormat:@"%zd",year + i];
[yearArray addObject:newYear];
}
NSInteger month = 0;
NSMutableArray *monthArray = [NSMutableArray array];
for (NSInteger i = 0; i<12; i++) {
NSString *newMonth = [NSString stringWithFormat:@"%zd",month + i + 1];
[monthArray addObject:newMonth];
}
NSMutableArray *totalArray = [NSMutableArray array];
[totalArray addObject:yearArray];
[totalArray addObject:monthArray];
return totalArray;
}
3.實現代理方法
-(void)getResultFromPickView:(NSString *)result{
[self.selectedBtn setTitle:result forState:UIControlStateNormal];
}
三.城市選擇效果:
city.gif
城市選擇代碼:
1.創建需要彈出的AlterController
AlterController *pickerView = [[AlterController alloc]initWithTitle:@"選擇城市" type:kTypeOfCity];
pickerView.dataArray = [self getCityData];
pickerView.delegate = self;
[self presentViewController:pickerView animated:YES completion:nil];
//標記所選按鈕
self.selectedBtn = sender;
2.加載城市數據
//獲取json中的城市數據
- (NSArray *)getCityData{
//province.json文件在demo中有,如果需要的話請大家下載demo哈,如果使用其他json或者XML文件可能出現顯示數據錯誤哦
NSString* path = [[NSBundle mainBundle] pathForResource:@"province" ofType:@"json"];
NSString* cityNames = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
if (cityNames == nil) {
NSLog(@"error:加載城市數據為空");
return nil;
}
NSData *jsonData = [cityNames dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSArray *arrayCityNames = [NSJSONSerialization JSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers
error:&err];
if(err) {
NSLog(@"json解析失敗:%@",err);
return nil;
}
return arrayCityNames;
}
3.實現代理方法
-(void)getResultFromPickView:(NSString *)result{
[self.selectedBtn setTitle:result forState:UIControlStateNormal];
}
四.總結
- 希望喜歡的小伙伴star一個哈,更多源碼可以下載demo,后續還會更新關于日期選擇,DateFormatter會更全一點,可以關注一下,點個關注,感謝
- 推薦參考文章:http://www.lxweimin.com/p/578065eab5ab