A.需求
1.自定义一个UIView和xib,包含国家名和国旗显示
2.学习row的重用
B.实现步骤
1.准备plist文件和国旗图片
2.创建模型
1//2//Flag.h3//CountriesSelection4//5//Created by hellovoidworld on 14/12/16.6//Copyright (c) 2014年 hellovoidworld. All rights reserved.7//89#import<Foundation/Foundation.h>1011@interfaceFlag : NSObject1213/** 国家名*/14@PRoperty(nonatomic, copy) NSString *name;1516/** 国旗*/17@property(nonatomic, copy) NSString *icon;1819- (instancetype) initWithDictionary:(NSDictionary *) dictionary;20+ (instancetype) flagWithDictionary:(NSDictionary *) dictionary;2122@end
1//2//Flag.m3//CountriesSelection4//5//Created by hellovoidworld on 14/12/16.6//Copyright (c) 2014年 hellovoidworld. All rights reserved.7//89#import"Flag.h"1011@implementationFlag1213- (instancetype) initWithDictionary:(NSDictionary *) dictionary {14if(self =[super init]) {15[self setValuesForKeysWithDictionary:dictionary];16}1718returnself;19}2021+ (instancetype) flagWithDictionary:(NSDictionary *) dictionary {22return[[self alloc] initWithDictionary:dictionary];23}2425@end
2.拖入PickerView, 准备主界面
3.实现dataSource和delegate方法
1#pragmamark - dataSource function2- (NSInteger)numberOfComponentsInPickerView:(UipickerView *)pickerView {3return1;4}56- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {7returnself.countries.count;8}910#pragmamark - delegate function11//使用返回UIView的row数据返回方法12- (UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {13//todo 创建自定义的view14}
4.创建自定义的UIView
5.设计自定row内容的xib,指定class
6.拖入控件到FlagView类,创建初始化方法和加载数据方法
1//2//FlagView.h3//CountriesSelection4//5//Created by hellovoidworld on 14/12/16.6//Copyright (c) 2014年 hellovoidworld. All rights reserved.7//89#import<UIKit/UIKit.h>1011@classFlag;12@interfaceFlagView : UIView1314/** 国旗数据成员*/15@property(nonatomic, strong) Flag *flag;1617/** 自定义构造方法*/18+ (instancetype) flagViewWithPickerView:(UIPickerView *) pickerView;1920/** 定义自己的高度*/21+(CGFloat) flagViewHeight;2223@end
1//2//FlagView.m3//CountriesSelection4//5//Created by hellovoidworld on 14/12/16.6//Copyright (c) 2014年 hellovoidworld. All rights reserved.7//89#import"FlagView.h"10#import"Flag.h"1112@interfaceFlagView()1314/** 国家名控件*/15@property (weak, nonatomic) IBOutlet UILabel *contryLabel;16/** 国旗控件*/17@property (weak, nonatomic) IBOutlet UIImageView *flagImage;1819@end2021@implementationFlagView2223+ (instancetype) flagViewWithPickerView:(UIPickerView *) pickerView {24return[[NSBundle mainBundle] loadNibNamed:@"FlagView"owner:nil options:nil].lastObject;25}2627/** 加载数据*/28- (void) setFlag:(Flag *)flag {29_flag =flag;3031//1.国家名32self.contryLabel.text =flag.name;3334//2.国旗35self.flagImage.image =[UIImage imageNamed:flag.icon];36}3738/** 定义自己的高度*/39+(CGFloat) flagViewHeight {40return44;41}4243@end
7.在控制器中加载解析数据
1//2//ViewController.m3//CountriesSelection4//5//Created by hellovoidworld on 14/12/16.6//Copyright (c) 2014年 hellovoidworld. All rights reserved.7//89#import"ViewController.h"10#import"Flag.h"11#import"FlagView.h"1213@interfaceViewController () <UIPickerViewDataSource, UIPickerViewDelegate>1415/** 国家选择器*/16@property (weak, nonatomic) IBOutlet UIPickerView *pickerView;1718/** 国家数组*/19@property(nonatomic, strong) NSArray *countries;202122@end2324@implementationViewController2526- (void)viewDidLoad {27[super viewDidLoad];28//Do any additional setup after loading the view, typically from a nib.2930//设置dataSource31self.pickerView.dataSource =self;32//设置delegate33self.pickerView.delegate=self;34}3536- (void)didReceiveMemoryWarning {37[super didReceiveMemoryWarning];38//Dispose of any resources that can be recreated.39}4041/** 加载数据*/42- (NSArray *) countries {43if(nil ==_countries) {44NSArray * dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"flags.plist"ofType:nil]];4546NSMutableArray *mCountriesArray =[NSMutableArray array];47for(NSDictionary *dictindictArray) {48Flag *flag =[Flag flagWithDictionary:dict];49[mCountriesArray addObject:flag];50}5152_countries =mCountriesArray;53}5455return_countries;56}5758#pragmamark - dataSource function59- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {60return1;61}6263- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {64returnself.countries.count;65}6667#pragmamark - delegate function68//使用返回UIView的row数据返回方法69- (UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {70FlagView *flagView =[FlagView flagViewWithPickerView:self.pickerView];71flagView.flag =self.countries[row];7273returnflagView;74}7576/** 设置row的高度*/77- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component {78return[FlagView flagViewHeight];79}8081@end
out:
C.row的重用
PickerView没有像TableView一样提供缓存池的方法 dequeueReusableCellWithIdentifier
在PickerView的delegate的row数据加载方法中提供了reusingView,是iOS内核缓存的UIView
1#pragmamark - delegate function2//使用返回UIView的row数据返回方法3- (UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {45FlagView *flagView;6if(nil ==view) {7flagView =[FlagView flagViewWithPickerView:self.pickerView];8}else{9NSLog(@"重用");10flagView = (FlagView *)view;11}1213flagView.flag =self.countries[row];1415NSLog(@"flagView - %p, view - %p", flagView, view);1617returnflagView;18}
==》但是在我的操作中,系统由始至终都没有传入缓存的UIView,每次都是使用了代码创建的FlagView
out:
2014-12-16 17:02:58.927 CountriesSelection[19352:1505008] flagView - 0x7ba7ee40, view - 0x0
2014-12-16 17:02:58.931 CountriesSelection[19352:1505008] flagView - 0x7b942300, view - 0x0
2014-12-16 17:02:58.936 CountriesSelection[19352:1505008] flagView - 0x79e44b80, view - 0x0
2014-12-16 17:02:58.937 CountriesSelection[19352:1505008] flagView - 0x79f64bc0, view - 0x0
2014-12-16 17:02:58.940 CountriesSelection[19352:1505008] flagView - 0x79f68e00, view - 0x0
2014-12-16 17:02:58.941 CountriesSelection[19352:1505008] flagView - 0x79f6a720, view - 0x0
2014-12-16 17:02:58.942 CountriesSelection[19352:1505008] flagView - 0x79f6bff0, view - 0x0
2014-12-16 17:02:58.943 CountriesSelection[19352:1505008] flagView - 0x79f6ff30, view - 0x0
2014-12-16 17:02:58.944 CountriesSelection[19352:1505008] flagView - 0x79f6e370, view - 0x0
2014-12-16 17:03:00.134 CountriesSelection[19352:1505008] flagView - 0x7b94a6c0, view - 0x0
2014-12-16 17:03:00.168 CountriesSelection[19352:1505008] flagView - 0x7b94b810, view - 0x0
2014-12-16 17:03:00.605 CountriesSelection[19352:1505008] flagView - 0x79f364c0, view - 0x0
2014-12-16 17:03:00.655 CountriesSelection[19352:1505008] flagView - 0x79f439e0, view - 0x0
2014-12-16 17:03:00.657 CountriesSelection[19352:1505008] flagView - 0x79f5a450, view - 0x0
2014-12-16 17:03:00.873 CountriesSelection[19352:1505008] flagView - 0x79f6cc60, view - 0x0
2014-12-16 17:03:01.477 CountriesSelection[19352:1505008] flagView - 0x7b94ce90, view - 0x0