[iOS基础控件 - 6.10.2] PickerView 自定义row内容 国家选择Demo

A.需求

1.自定义一个UIView和xib,包含国家名和国旗显示

2.学习row的重用

B.实现步骤

1.准备plist文件和国旗图片

2.创建模型

 1 //
 2 //  Flag.h
 3 //  CountriesSelection
 4 //
 5 //  Created by hellovoidworld on 14/12/16.
 6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 @interface Flag : NSObject
12
13 /** 国家名 */
14 @property(nonatomic, copy) NSString *name;
15
16 /** 国旗 */
17 @property(nonatomic, copy) NSString *icon;
18
19 - (instancetype) initWithDictionary:(NSDictionary *) dictionary;
20 + (instancetype) flagWithDictionary:(NSDictionary *) dictionary;
21
22 @end
 1 //
 2 //  Flag.m
 3 //  CountriesSelection
 4 //
 5 //  Created by hellovoidworld on 14/12/16.
 6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import "Flag.h"
10
11 @implementation Flag
12
13 - (instancetype) initWithDictionary:(NSDictionary *) dictionary {
14     if (self = [super init]) {
15         [self setValuesForKeysWithDictionary:dictionary];
16     }
17
18     return self;
19 }
20
21 + (instancetype) flagWithDictionary:(NSDictionary *) dictionary {
22     return [[self alloc] initWithDictionary:dictionary];
23 }
24
25 @end

2.拖入PickerView, 准备主界面

3.实现dataSource和delegate方法

 1 #pragma mark - dataSource function
 2 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
 3     return 1;
 4 }
 5
 6 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
 7     return self.countries.count;
 8 }
 9
10 #pragma mark - delegate function
11 // 使用返回UIView的row数据返回方法
12 - (UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
13     //todo 创建自定义的view
14 }

4.创建自定义的UIView

5.设计自定row内容的xib,指定class

6.拖入控件到FlagView类,创建初始化方法和加载数据方法

 1 //
 2 //  FlagView.h
 3 //  CountriesSelection
 4 //
 5 //  Created by hellovoidworld on 14/12/16.
 6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import <UIKit/UIKit.h>
10
11 @class Flag;
12 @interface FlagView : UIView
13
14 /** 国旗数据成员 */
15 @property(nonatomic, strong) Flag *flag;
16
17 /** 自定义构造方法 */
18 + (instancetype) flagViewWithPickerView:(UIPickerView *) pickerView;
19
20 /** 定义自己的高度 */
21 + (CGFloat) flagViewHeight;
22
23 @end
 1 //
 2 //  FlagView.m
 3 //  CountriesSelection
 4 //
 5 //  Created by hellovoidworld on 14/12/16.
 6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import "FlagView.h"
10 #import "Flag.h"
11
12 @interface FlagView()
13
14 /** 国家名控件 */
15 @property (weak, nonatomic) IBOutlet UILabel *contryLabel;
16 /** 国旗控件 */
17 @property (weak, nonatomic) IBOutlet UIImageView *flagImage;
18
19 @end
20
21 @implementation FlagView
22
23 + (instancetype) flagViewWithPickerView:(UIPickerView *) pickerView {
24     return [[NSBundle mainBundle] loadNibNamed:@"FlagView" owner:nil options:nil].lastObject;
25 }
26
27 /** 加载数据 */
28 - (void) setFlag:(Flag *)flag {
29     _flag = flag;
30
31     // 1.国家名
32     self.contryLabel.text = flag.name;
33
34     // 2.国旗
35     self.flagImage.image = [UIImage imageNamed:flag.icon];
36 }
37
38 /** 定义自己的高度 */
39 + (CGFloat) flagViewHeight {
40     return 44;
41 }
42
43 @end

7.在控制器中加载解析数据

 1 //
 2 //  ViewController.m
 3 //  CountriesSelection
 4 //
 5 //  Created by hellovoidworld on 14/12/16.
 6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import "ViewController.h"
10 #import "Flag.h"
11 #import "FlagView.h"
12
13 @interface ViewController () <UIPickerViewDataSource, UIPickerViewDelegate>
14
15 /** 国家选择器 */
16 @property (weak, nonatomic) IBOutlet UIPickerView *pickerView;
17
18 /** 国家数组 */
19 @property(nonatomic, strong) NSArray *countries;
20
21
22 @end
23
24 @implementation ViewController
25
26 - (void)viewDidLoad {
27     [super viewDidLoad];
28     // Do any additional setup after loading the view, typically from a nib.
29
30     // 设置dataSource
31     self.pickerView.dataSource = self;
32     // 设置delegate
33     self.pickerView.delegate = self;
34 }
35
36 - (void)didReceiveMemoryWarning {
37     [super didReceiveMemoryWarning];
38     // Dispose of any resources that can be recreated.
39 }
40
41 /** 加载数据 */
42 - (NSArray *) countries {
43     if (nil == _countries) {
44         NSArray * dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"flags.plist" ofType:nil]];
45
46         NSMutableArray *mCountriesArray = [NSMutableArray array];
47         for (NSDictionary *dict in dictArray) {
48             Flag *flag = [Flag flagWithDictionary:dict];
49             [mCountriesArray addObject:flag];
50         }
51
52         _countries = mCountriesArray;
53     }
54
55     return _countries;
56 }
57
58 #pragma mark - dataSource function
59 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
60     return 1;
61 }
62
63 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
64     return self.countries.count;
65 }
66
67 #pragma mark - delegate function
68 // 使用返回UIView的row数据返回方法
69 - (UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
70     FlagView *flagView = [FlagView flagViewWithPickerView:self.pickerView];
71     flagView.flag = self.countries[row];
72
73     return flagView;
74 }
75
76 /** 设置row的高度 */
77 - (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component {
78     return [FlagView flagViewHeight];
79 }
80
81 @end

out:

C.row的重用

PickerView没有像TableView一样提供缓存池的方法 dequeueReusableCellWithIdentifier

在PickerView的delegate的row数据加载方法中提供了reusingView,是iOS内核缓存的UIView

 1 #pragma mark - delegate function
 2 // 使用返回UIView的row数据返回方法
 3 - (UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
 4
 5     FlagView *flagView;
 6     if (nil == view) {
 7         flagView = [FlagView flagViewWithPickerView:self.pickerView];
 8     } else {
 9         NSLog(@"重用");
10         flagView = (FlagView *)view;
11     }
12
13     flagView.flag = self.countries[row];
14
15     NSLog(@"flagView - %p, view - %p", flagView, view);
16
17     return flagView;
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

时间: 2024-10-19 11:44:02

[iOS基础控件 - 6.10.2] PickerView 自定义row内容 国家选择Demo的相关文章

[iOS基础控件 - 6.10.1] PickerView 餐点搭配Demo

A.需求 1.使用PickerView做出有3列餐点(水果.主菜.饮料)的搭配Demo 2.选择的餐点实时显示在“显示区” 3.提供“随机”按钮,随机选择菜品搭配 B.实现步骤 1.拖入一个PickerView 2.用控制器配置dataSource和delegate 1 // 遵守UIPickerViewDataSource,UIPickerViewDelegate 2 @interface ViewController () <UIPickerViewDataSource, UIPickerV

[iOS基础控件 - 6.10] Notification 通知机制

A.定义 iOS程序都有一个NSNotificationCenter的单例对象,用来负责发布不同对象之间的通知 任何对象都能够在NSNotificationCenter发布通知,发布自己的发生的事件:监听者(Observer)可以选择接受某个特定通知.   B.使用 1. 属性      - (NSString*)name; // 通知的名称      - (id)object; // 通知发布者(是谁要发布通知) - (NSDictionary*)userInfo; // 一些额外的信息(通知

[iOS基础控件 - 6.10.6] UIApplicationDelegate

A.概念 1.移动app非常容易受到其他的系统.软件事件的干扰,如来电.锁屏 2.app受到干扰的时候,UIApplication会通知delegate,来代理处理干扰事件 3.delegate可以处理的事件 (1)app声明周期(启动.关闭) (2)系统事件(来电) (3)紧急事件(内存警告) B.使用 称为delegate的条件:遵守UIApplicationDelegate协议 项目开始会自动创建:AppDelegate 1.delegate方法 1 - (BOOL)application

[iOS基础控件 - 6.10.7] UIWindow &amp; 程序启动过程

A.UIWindow概念 1.继承UIView,是一种特殊的UIView 2.通常一个APP只有一个UIWindow 3.iOS程序启动后,创建的第一个视图就是UIWindow 4.没有UIWindow,不能显示任何东西 B.使用 1.创建一个Empty Application项目 没有了storyboard,要手动实现UIWindow的创建代码(其实这就是storyboard做的事情) 1 // 手动创建UIWindow,并加到screen上 2 self.window = [[UIWindo

[iOS基础控件 - 6.10.3] DatePicker &amp; UIToolBar

A.需求 1. 学习DatePicker的基本配置 2.使用TextField召唤指定类型的输入键盘View,这里使用DatePicker 3.给输入键盘上方加上一个UIToolBar,实现如关闭键盘等功能 B.DatePicker使用 1.DatePicker的主要属性 Mode:显示的内容,可以选择日期.时间的自由组合 Locale:显示的语言样式 Interval:每个选项的时间间隔 Date:当前选择的时间 Constraint:指定最小和最大时间 Timer:计时器 2.使用代码创建D

[iOS基础控件 - 6.10.4] 项目启动原理 项目中的文件

A.项目中的常见文件 1.单元测试Test 2.Frameworks(xCode6 创建的SingleView Project没有) 依赖框架 3.Products 打包好的文件 4. projectname-Info.plist 全局配置文件 所以最好其他的plist文件不要带有Info字眼 (1)更改项目名 a.修改Bundle display name b.clean c.模拟器删除app,重新生成 (2)Bundle Identifier App唯一标识符 (3)stroyboard入口

[iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表&quot;练习)

A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不可以再按 2.在屏幕中间弹出一个消息框,通知消息“xx已经被安装”,慢慢消失 3.消息框样式为圆角半透明 B.不使用代理模式,使用app空间组和主View之间的父子View关系 1.在主View中创建一个消息框 主View控制器:ViewController.m 1 // 创建下载成功消息框 2 CGFloat labelWid

iOS基础控件UINavigationController中的传值

iOS基础控件UINavigationController中的传值,代理传值,正向传值,反向传值 #import <UIKit/UIKit.h> //声明一个协议 @protocol SendValue<NSObject> //定义一个方法 - (void)sendBtnTitle:(NSString *)title; @end @interface FirstViewController : UIViewController // 定义代理 @property (nonatomi

ios基础控件之开关按钮(UISwitch)

UISwitch控件是iOS开发的基础控件,是非常简单的一个控件,因为它的方法比较少.UISwitch继承于UIControl基类,因此可以当成活动控件使用. 注意:开关状态通过它的on属性进行读取,该属性是一个BOOL属性 创建: UISwitch* mySwitch = [[ UISwitch alloc]initWithFrame:CGRectMake(0.150.0f,100.0f,0.0f,0.0f)]; 可能你会疑问为什么它的大小都设置为0?没错,它的大小你设置是无效的,系统会为你分