使用UIPickerView显示数据

iOS-中国省市区plist(续)UIPickerView的应用 上一篇文章将plist文件中的中国省市区读取后,保存为json字符串打印出来后没有错误,现在再将其数据利用UIPickerView展示。 1,以前运用UIPickerView一般是年月日,基本上数据都是死数组组成,例如每年就12个月 ,一个月天数也就28,28,30或者31,这样的话写起来应该不会麻烦; 2,省市区对照表中,每个省对应的市不同,每个市对应的区也不同,这就导致在填充数据时会动态改 阅读详情

最近学习UIPickerView使用,练习时候想遇到些问题,总结一下。

用UIPickerView 显示7个组件,每个组件中的数据要居中对齐,1-6组件中字体颜色为红色,7组件中字体颜色为蓝色。

在控制器中创建两个实例变量:

UIPickerView *picker; 

NSArray *datasourceArray; //用做数据源

因为UIPickerView中的文本不能设置颜色和对齐方式,所以delegate使用UILabel显示文本,并使用返回视图(UIView *)的方法:

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view

有三种方案可供选择:

1.不需要创建实例变量,直接在Delegate方法中创建UILabel,设置属性,并返回。

2.在初始化时,创建模板可变数组,并根据最大组件的总行数,把Label控件插入此可变数组中,再把此模板数组赋值给 dataSource。最后Delegate调用方法返回模板数组中的相应行的对象。

3.创建7个数组的实例变量,分别作为picker每个组件的数据源,再创建相应数量的UILabel,分别设置好。最后Delegate调用方法返回相应数据源中的对象。

01 //实现第1方案:
02 - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
03  
04     UILabel *showLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0f,0.0f,20.0f,20.0f)];
05  
06     showLabel.text = [NSString stringWithFormat:@"%d",row+1];
07     showLabel.backgroundColor = [UIColor clearColor];
08      
09     //如果是第7个组件,字体颜色设置为蓝色。其余组件设置为红色。
10     if (component == 6) {
11  
12        showLabel.textColor = [UIColor blueColor];
13  
14     }else {
15  
16        showLabel.textColor = [UIColor redColor];
17  
18     }
19  
20     showLable.textAlignment = UITextAlignmentCenter;
21  
22     return [showLabel autorelease];
23 }
24  
25 //这样每次旋转组件时都会创建一个新对象,并放入自动释放池中,如果以后大量旋转,会创建巨量对象。

2 在初始化时,创建模板可变数组,并根据最大组件的总行数,把Label控件插入此可变数组中,再把此模板数组赋值给 dataSource。最后Delegate调用方法返回模板数组中的相应行的对象。

01 //实现第2方案:
02 -(void) viewDidLoad {
03  
04     NSMutableArray * mutableArray = [NSMutableArray arrayWithCapacity:20];
05      
06     for(NSUInteger i = 1;i <= 33 ;i++) {
07  
08         UILabel *showLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0f,0.0f,20.0f,20.0f)];
09         showLabel.text = [NSString stringWithFormat:@"%d",i];
10         showLabel.backgroundColor = [UIColor clearColor];
11         showLabel.textColor = [UIColor redColor]; //需要显示红色组件多,默认使用红色.
12         showLable.textAlignment = UITextAlignmentCenter;
13         [mutableArray addObject:showLabel];
14         [showLabel release];
15     }//模板初始化完成
16      
17  
18     self.datasourceArray = mutableArray;
19  
20 }
21  
22  
23 - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
24  
25     if (component == 6 ) {
26        //如果是第7个组件,返回对象字体颜色设置为蓝色。其余组件设置为红色。
27        UILabel * myLabel = [self.datasource objectAtIndex:row];
28        myLabel.textColor = [UIColor blueColor];
29        return myLabel;
30  
31     }else {
32  
33        return [self.datasource objectAtIndex:row];
34  
35     }
36 }

但是到程序运行时出现问题,正常应该显示7个组件的内容,但现在只能显示一个组件的内容。并且只要旋转其它组件显示出来的内容与已经显示出来的相同,那么已经显示出来的内容就会消失。

例如:程序刚运行时第一个组件显示出了1,2,3.其它组件显示不出内容。如果旋转1组件,显示出4,5,6,7,8,再旋转2组件,当2组件显示出4,5,6,7,8时,1组件的就会消失。

也就是说,不同的组件,如果显示相同的内容时,只会显示最后旋转的组件。

应该是没有把mutableArray数组进行深度复制(Deep Copy)造成,修改原实例变量名为 datasource1,并增加6个新实例变量,datasource2,datasource3 ......datasource7,

再修改viewDidLoad如下:

01 -(void) viewDidLoad {
02  
03     NSMutableArray * mutableArray = [NSMutableArray arrayWithCapacity:20];
04      
05     for(NSUInteger i = 1;i <= 33 ;i++) {
06  
07         UILabel *showLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0f,0.0f,20.0f,20.0f)];
08         showLabel.text = [NSString stringWithFormat:@"%d",i];
09         showLabel.backgroundColor = [UIColor clearColor];
10         showLabel.textColor = [UIColor redColor]; //需要显示红色组件多,默认使用红色.
11         showLable.textAlignment = UITextAlignmentCenter;
12         [mutableArray addObject:showLabel];
13         [showLabel release];
14     }//模板初始化完成
15      
16     //为每个实例变量deep copy 一份模板数据.
17     for(NSUInteger i = 1;i<=7 ;i++) {
18  
19        NSArray *newArray = [[NSArray alloc] initWithArray:mutableArray copyItems:YES];
20        [self setValue:newArray forKey:[NSString stringWithFormat:@"datasource%d",i]]; //想当于 self.datasource(1-7) = newArray
21        [newArray release];
22     }
23  
24 }

修改delegate方法如下:

01 - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
02  
03     if(component == 0 ) {
04  
05       return [self.datasource1 objectAtIndex:row];
06  
07     }else if (component == 1){
08  
09       return [self.datasource2 objectAtIndex:row];
10  
11     }else if (component == 2){
12  
13       return [self.datasource3 objectAtIndex:row];
14  
15     }else if (component == 3){
16  
17       return [self.datasource4 objectAtIndex:row];
18  
19     }else if (component == 4){
20  
21       return [self.datasource5 objectAtIndex:row];
22  
23     }else if (component == 5){
24  
25       return [self.datasource6 objectAtIndex:row];
26  
27     }else {
28  
29       UILabel * myLabel = [self.datasource7 objectAtIndex:row];
30       myLabel.textColor = [UIColor blueColor];
31       return myLabel;
32  
33     }
34 }

运行程序,这次运行直接退出,打开控制台找到错误提示,原来是因为模板数组中的对象是UILabel,而UILabel没有遵循NSCopying协议,不能进行深度复制。看来第2方案行不通了。

3 创建 UILabel存到Datasource的数组中。delegate直接返回数组中的UILabel。优点是调用委托方法时直接返回相应数据对像即可,缺点是需要先把全部的UILabel创建完成。

//实现第3方案:
-(void) viewDidLoad {
 
    NSMutableArray * mutableArray = [NSMutableArray arrayWithCapacity:20];
    NSUInteger j=0;
    for (NSUInteger i = 1; i <= 7 ;i++) {
 
        j++;
 
        for(NSUInteger i = 1;i <= 33 ;i++) {
 
            UILabel *showLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0f,0.0f,20.0f,20.0f)];
            showLabel.text = [NSString stringWithFormat:@"%d",i];
            showLabel.backgroundColor = [UIColor clearColor];
 
            if(j == 7) {
 
                showLabel.textColor = [UIColor blueColor];
 
            }else {
 
                showLabel.textColor = [UIColor redColor];
 
            }
 
            showLable.textAlignment = UITextAlignmentCenter;
            [mutableArray addObject:showLabel];
            [showLabel release];
        }
         
        [self setValue:mutableArray forKey:[NSString stringWithFormat:@"datasource%d",i];
    }
}
 
 
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
 
    if(component == 0 ) {
 
      return [self.datasource1 objectAtIndex:row];
 
    }else if (component == 1){
 
      return [self.datasource2 objectAtIndex:row];
 
    }else if (component == 2){
 
      return [self.datasource3 objectAtIndex:row];
 
    }else if (component == 3){
 
      return [self.datasource4 objectAtIndex:row];
 
    }else if (component == 4){
 
      return [self.datasource5 objectAtIndex:row];
 
    }else if (component == 5){
 
      return [self.datasource6 objectAtIndex:row];
 
    }else {
 
      return [self.datasource7 objectAtIndex:row];
 
    }
}

这次程序运行与第1方案相同,每次旋转组件时,不会创建任何对象。但是在程序初始化时会一次性创建全部所需对像。

总结:

第1方案 动态创建对象,适用于所需对象较多,但旋转较少的情况。(每个组件,每次显示一行,都会调用Delegate方法)。

第3方案 静态创建对象,适用于旋转较多的情况。这样每次调用Delegate方法不会生成任何对象。

多个组件需要使用不同的对象(UILabel).

UILabel不能深度复制.

PGPickerView:PGPickerView是将UIPickerView的弯曲弧度变成直列表,可以是单列表,多列表,还可以修改标注的字体颜色等 PGPickerView PGPickerView是将UIPickerView的弯曲弧度变成直列表,可以是单列表,多列表,还可以修改标签的字体颜色等,使用跟UIPickerView一样。 内置3中样式 样式一 样式二 样式三 显示中间字 CocoaPods安装 pod 'PGPickerView', '>= 1.2.1' 使用 PGPickerView *pickerView = [[PGPickerView alloc]initWithFrame:self.view.bounds]; pickerView.delegate = self; pickerView.dataSource = s 立即下载

相关推荐

PowerBuilder 9.0安装组件全解析:Adaptive Server Anywhere、PowerDynamo、InfoMaker到底怎么选?

本文从技术架构师视角详细解析PowerBuilder 9.0安装组件选型策略,包括Adaptive Server Anywhere、PowerDynamo和InfoMaker的核心功能与应用场景。通过分析组件间的依赖关系和安装冲突机制,提供针对不同开发需求的最佳安装方案,帮助开发者高效配置PB9.0开发环境。

weixin_28700593的博客 441

UI基本控件(五):UIPikerView

UIPickerView是使用旋转轮或类似老虎机来显示一组或多组值的视图。 时钟应用中设置时间就是通过UIPickerView来实现的。 1.numberOfComponents:返回UIPickerView当前的列数 NSIntegernum = _pickerView.numberOfComponents; NSLog( @"%d", num); 2.- (NSInteger)numberOfRowsInComponent:(NSInteger)component;返...

努力进阶的小菜鸟 906

微信小程序协同工作和发布

微信小程序协同工作和发布

qq_53114527的博客 1620

uniapp中修改picker-view样式及选中行的文字颜色

uniapp:在使用picker-view组件时,有些样式需要自定义,可以参考官方文档添加类名;但是无法修改选中行的字体颜色,后面解决方法就是通过动态添加类名的方式,给选中项添加类名。 value是一个数组,第一项value[0]就是选中行的索引值,如果当前索引=选中行的索引则添加类名,否则不添加。

qq_51390898的博客 4165

使用ACOLITE对OLCI影像进行大气校正+批处理

使用ACOLITE对OLCI影像进行大气校正+批处理

mrzhy1的博客 7359

Vivado 2018.3实战:用IDELAYE3和ISERDESE3搞定高速ADC数据采集(附仿真源码)

本文详细介绍了在Vivado 2018.3中使用Xilinx UltraScale架构的IDELAYE3和ISERDESE3原语实现高速ADC数据采集的实战方法。通过分析5GHz采样系统的时序挑战,提供从PCB布局到Vivado实现的完整解决方案,包括精密时序校准、多相位数据重组及系统级调试技巧,并附赠仿真源码助力工程师快速掌握高速数据采集技术。

weixin_30567225的博客 582

iOS开发自定义UIPickView

苹果一直推崇使用原生的组件,自带的UIPickView其实也很漂亮了,看起来也很美观。但是有时候,产品会有一些特殊的设计和需求。本文将会讲解如何修改苹果原生的组件的属性,达到自定义UIPickView的效果。

JoySeeDog 2809

从Si3N4到SiNx:一文搞懂芯片制造中氮化硅的化学式玄机(附工艺参数影响)

本文深入探讨了芯片制造中氮化硅(SiNx)化学式的调控艺术,揭示了从Si3N4到SiNx的转变如何影响材料性能。通过分析PECVD和PVD工艺参数对x值的精确调控,以及x值对电学和机械性能的影响,为半导体制造提供了实用的工艺优化策略。

weixin_30776273的博客 192

iOS - UIPickerView文字大小颜色修改,无限轮播,无限循环滚动

最近项目里用到了UIPickerView,要求无限轮播,简单看了看UIPickView的所有属性和所有代理方法,没有无限轮播的设置,遂去百度了一把,发现网上流传着一个帖子,大家各种转载,看了看后,明白其中道理,原来是这样! UIPickerView,使用规则与UITableView很像,下边是UIPickerView的.h文件,包涵两个代理的描述: // // UIPickerView.h

icefishlily的博客 6870

AttributeError: module ‘numpy‘ has no attribute ‘int‘解决方案

本文主要介绍了AttributeError: module ‘numpy’ has no attribute 'int’解决方案,希望能对使用numpy的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 方案一 2.2 方案二

weixin_43178406的博客 28万+

001、NPU是什么?为什么嵌入式设备需要它?

本文通过作者调试工业相机板卡的经历,引出嵌入式设备为何需要NPU(神经网络处理器)的探讨。文章对比了CPU和NPU的设计哲学差异,指出NPU通过专用乘加器阵列和优化的数据流,能高效处理神经网络运算。作者分析了嵌入式设备使用NPU的三大优势:算力提升、功耗降低和实时性保障,并介绍了三类常见NPU形态。通过一个YOLOv5模型调试案例,揭示了NPU使用中的常见陷阱,最后给出五条实用建议,强调理解NPU原理和局限的重要性。文章生动展现了NPU在嵌入式AI应用中的关键作用。

m0_50546716的博客 125

UIPickerView 调研笔记

这是本人第一次写优快云博客, 也是今天申请的账号(好开心), 以前总是上百度看到别人的技术博客,好羡慕,就想着自己也能动手写一些东西,然而我是一个刚刚学习iOS 的小菜鸟, 写的不好,请各位同行不吝指点一二,万分感激.   这两天自学了下UIPickerview 这个控件, 废话不多说来看看我对这个控件的理解.   UIPickerview 跟 UItableView很相似 需要 签订两个协

DraculaCoco的博客 447

手把手教你学PCIE--系统内存管理:GART(Graphics Address Remapping Table)的典型用途详解

GART(图形地址重映射表)是GPU的核心组件,主要用于地址映射转换。其典型用途分为物理模式和虚拟模式两类:在物理模式下,GART将GPU虚拟地址映射到分散的物理内存,支持DMA连续访问非连续内存块,适用于GPU渲染纹理采样和AI推理数据搬运等场景;在虚拟模式下,GART配合IOMMU实现多级映射,将GPU虚拟地址转换为虚拟机物理地址再映射到宿主机物理地址,确保多租户隔离,应用于云服务器GPU共享和容器化AI训练等虚拟化环境。两种模式分别优化了高性能计算场景和虚拟化场景的需求。

MHD0815的博客 367

UIPickerView的用法

#import "ViewController.h" @interface ViewController () { NSArray *_mapArray; NSArray *_kindsArray; NSArray *_detailsArray; } @property (weak, nonatomic) IBOutlet UIPickerView *pickerVi

高小波_heat 的博客 303

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

iOS7_关于UIPickerView_如何实现UIPickerView_如何设定UIPickerView组数_每组数据的行数...

在界面上实现一个UIPickerView: 1、新建一个 singleViewApplication,在 xxxViewController.m文件中: 1 @interface moboViewController () 2 @property (nonatomic, strong) UIPickerView *picker; 3 @end 2、在 -(void)vi...

aqu11528的博客 196

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

iOS开发-数据选择UIPickerView(案例二)

iOS学习之UIPickerView控件的简单使用 版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] UIPickerView控件在给用户选择某些特定的数据时经常使用到,这里演示一个简单的选择数据,显示在UITextField输入框里,把UIPickerView作为输入View,用Toolbar作为选定数据的按钮。

michaelKiven的博客 707

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

UIKit 框架之UIPickerView

// // ViewController.m // UIPickerView // // Created by City--Online on 15/5/18. // Copyright (c) 2015年 XQB. All rights reserved. // #import "ViewController.h" @interface ViewControl...

weixin_30894583的博客 89

iOS——UIPickerView使用

UIPickerView UIPickerView在iOS开发中是一个很常见的控件,例如计时器选择时间,填写省市区位置时都可以用的上,最近写项目时使用到了这个技术,总结一下。 遵循的协议 UIPickerView类似于UITableView这类控件,是需要遵循数据源和代理两个协议的。 我们在使用前添加这两个协议。 @interface ViewController : UIViewController< UIPickerViewDelegate, UIPickerViewDataSource >

chabuduoxs的博客 5056

UIPickerView的使用

代理方法 初始化     self.selectPicker.delegate = self;     self.selectPicker.dataSource = self;     self.selectPicker.frame = CGRectMake(0, 480, 320, 216) ; 代理方法 显示pickerview的components的个数 -

shuju345的博客 792

UiPickerView基本使用方法

注意: 1.使用PickerView之前需要指定数据源对象和代理对象。 2.需要使用到两个协议:UiPickerViewDataSource,数据源协议、 UiPickerViewDelegate代理协议 一、UiPickerView显示数据的步骤 1.懒加载Plist文件 2.设置控制器是当前UiPickerView的数据源对象和代理对象 3.实现数据源方法numbe...

weixin_30780221的博客 138

UIPickerView 显示与隐藏

转载自  http://www.devdiv.com/home.php?mod=space&uid=45444&do=blog&id=6238 UIPickerView* pickerView = [[UIPickerView alloc] init];[pickerView sizeToFit];pickerView.autoresizingMask = (UIViewAutore

getengwork的专栏 1116

iOS之UIPickerView的使用--多列选择器

1、.h #import @interface FKViewController : UIViewController @property (strong, nonatomic) IBOutlet UIPickerView *picker; @end 2、.m #import "FKViewController.h" @interface FKViewController () @

yuxikuo_1的专栏 2270

UIPickerView的使用(菜单系统)

UI进阶-第01天 /** 摘要: 掌握UIPicderView的使用 掌握键盘工具条的使用 */ 一、UIPikcerView的使用 》打开官方文档 查看DatePicker/UIPikcerView在iOS6与iOS7的区别 查找至UserExperience — Guides — iOS 7 UI Transition Guide — Co...

weixin_34362790的博客 108
上一篇: NIO ByteBuffer 使用方法
下一篇: android 启动第三方程序的代码
vrix
博客等级 码龄24年 673粉丝 167原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值