【iOS控件】—— UIPickerView的使用

【iOS控件】—— UIPickerView的使用

  • 一. 简述UIPickerView
    • 1. 什么是UIPickerView
    • 2. UIPickerView遵守的协议
  • 二. 测试Demo
  • 三. 总结

一. 简述UIPickerView

先看一下UIPickerView的效果图:
在这里插入图片描述
在这里插入图片描述

1. 什么是UIPickerView

UIPickerView是iOS平台上的一个用户界面元素,用于在应用程序中显示和选择多个选项中的一个。它通常以类似于滚轮的形式呈现,允许用户通过滑动手势来选择列表中的项目,UIPickerView由一个或多个组件(Component)组成,每个组件都表示一个独立的选项列表。每个组件可以包含多个行(Row),每一行代表一个具体的选项。用户可以通过滑动每个组件的滚轮来选择特定的行。

2. UIPickerView遵守的协议

UIPickerView需要遵守两个基础的协议。

#import <UIKit/UIKit.h>@interface ViewController : UIViewController
<UIPickerViewDelegate, UIPickerViewDataSource>@end

UIPickerViewDataSource:
此协议中有两个必须实现的方法
分别是设置选择器的行和列数。

//表示有几列
- (NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView {return 3;}//每一列中有几个格子
- (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {if (component == 0) {return self.directionArray.count;} else if (component == 1) {return self.curentNameArray.count;} else {return 1;}
}

UIPickerViewDeleagate:
有以下方法:

//返回UIPickerView中Component列的宽度- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component;//返回UIPickerView中Component列中每行的高度- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component;//当选择某一项Component列中的row行时的回调函数- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component//标准的UIPickerView内容,只有字符串- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;//自定义的UIPickerView内容,给每个列,行设置一个UIView对象- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view;//这里列为component,行row返回一个UIView用来显示在UIPickerView中。reusingView:(UIView *)

刷新数据的方法:

- (void)reloadAllComponents;
- (void)reloadComponent:(NSInteger)component;

二. 测试Demo

以上都是一些基础的概念性的东西,接下来通过一个Demo来实现一下上面的功能。
首先要先定义一个UIPickerView的视图然后进行初始化。

@interface ViewController ()@property (nonatomic, copy) NSArray* directionArray;
@property (nonatomic, copy) NSArray* curentNameArray;
@property (nonatomic, copy) NSArray* nameArray1;
@property (nonatomic, copy) NSArray* nameArray2;
@property (nonatomic, copy) NSArray* nameArray3;
@property (nonatomic, copy) NSArray* nameArray4;
@property (nonatomic, copy) NSArray* nameArray5;
@property (nonatomic, copy) NSArray* nameArray6;@property (nonatomic, copy) NSArray* Dict;
@property (nonatomic, copy) NSArray* endArray;
@property (nonatomic, copy) NSString* currentEndString;@property (nonatomic, strong) UIPickerView* pickerView;@end

然后对这些数组进行初始化,并且初始化UIPickerView。

[self loadDate];self.pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 200, [UIScreen mainScreen].bounds.size.width, 200)];self.pickerView.delegate = self;self.pickerView.dataSource = self;[self.view addSubview:self.pickerView];- (void) loadDate {self.directionArray = @[@"陕西", @"山西", @"重庆", @"河南", @"湖北", @"四川"];self.nameArray1 = @[@"西安", @"榆林", @"咸阳", @"宝鸡", @"延安", @"渭南"];self.nameArray2 = @[@"太原", @"长治", @"吕梁", @"晋城", @"运城", @"临汾"];self.nameArray3 = @[@"重庆", @"涪陵", @"万州", @"永州", @"江津", @"长寿"];self.nameArray4 = @[@"郑州", @"洛阳", @"南阳", @"许昌", @"周口", @"新乡"];self.nameArray5 = @[@"武汉", @"襄阳", @"宜昌", @"荆州", @"荆门", @"黄石"];self.nameArray6 = @[@"成都", @"绵阳", @"南充", @"宜宾", @"泸州", @"达州"];self.endArray = @[@"秦", @"晋", @"巴", @"韩", @"楚", @"蜀"];self.Dict = @[self.nameArray1, self.nameArray2, self.nameArray3, self.nameArray4, self.nameArray5, self.nameArray6];self.curentNameArray = self.Dict[0];self.currentEndString = self.endArray[0];}

然后实现必须的方法以及你需要的方法:

//表示有几列
- (NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView {return 3;}//每一列中有几个格子
- (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {if (component == 0) {return self.directionArray.count;} else if (component == 1) {return self.curentNameArray.count;} else {return 1;}
}// 滑动触发事件
- (void) pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {// 使用一个UIAlertView来显示用户选中的列表项if (component == 0) {self.curentNameArray = self.Dict[row];self.currentEndString = self.endArray[row];[self.pickerView reloadComponent:1];[self.pickerView reloadComponent:2];//这个方法的selectRow即可以表示你更新第一个列表之后是否更新到第二个列表的对应的row// BOOL类型的YES表示动画效果[self.pickerView selectRow:0 inComponent:1 animated:YES];[self.pickerView selectRow:0 inComponent:2 animated:YES];NSLog(@"选择了%@方向",self.directionArray[row]);} else {NSLog(@"%@", self.curentNameArray[row]);}}// 返回列表的内容
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {if (component == 0) {return self.directionArray[row];} else if (component == 1){return  self.curentNameArray[row];} else {return  self.currentEndString;}
}
// 返回列表的宽度
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {return 130;}

三. 总结

UIPickerView使用滚轮形式展示选项,用户可以通过滑动手势来选择,这种交互方式直观且易于使用,可以显示多个选项,但只占用有限的屏幕空间,适用于在有限的界面空间中提供大量选项选择的情况。但是仍然有缺点,由于UIPickerView一次只显示有限数量的选项,对于包含大量选项的情况,可能会导致用户需要频繁滚动和选择,不太方便。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/194329.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel导入组件的封装以及使用页面点击弹出该弹框

封装的组件 <template><el-dialogwidth"500px"title"员工导入":visible"showExcelDialog"close"$emit(update:showExcelDialog, false)"><el-row type"flex" justify"center"><div class&q…

轻松生成二维码:SpringBoot 与 ZXing 完美结合(综合指南)-开源充电桩平台(充电桩平台源码)

分享一套开源充电桩云平台&#xff08;v2.5.1&#xff09;-- 支持二轮(电动自行车)、四轮(电动汽车) 文章目录 前言一、1 前言&#xff1f;二、2 介绍QR码和ZXing三、3 springboot整合zxing添加ZXing依赖生成二维码生成条形码 分享一套开源充电桩云平台&#xff08;v2.5.1&…

JVM:强软弱虚四种引用

下面依次解释五种引用 一、强引用 把一个对象赋值给一个引用变量&#xff0c;就相当于把这个对象的强引用放到变量中。 只要对象可达&#xff0c; GC一定不会回收这个对象&#xff08;A1&#xff09; 二、软引用 当一个对象&#xff08;A2&#xff09;没有强引用时&#xff…

python 自主学习笔记

文章目录 前言相关教程模板字符串JavaScriptC#Python 临时变量C#的ValueTuplePython字典 自定义模块化封装的文件路径问题解决方案 暂时结束 前言 最近在学halcon&#xff0c;机器视觉&#xff0c;越学越发现&#xff0c;python是无法避免的语言。因为python用途实在是太广了。…

c/c++的字符和字符串输入输出

注&#xff1a; 1.下面这些为本人大学四年所用过的处理办法&#xff0c; 至今为止遇到的所有编程题都能够使用。如果需要了解更多关于putchar,cin.get,cin.getline等的请自行搜索。 2.getchar相当于获取一个字符&#xff0c;可以实现单个字符的输入以及通过循环实现多个字符输…

英语语法学习 - 每周更新学英语知识点

目录 询问 Would Some用法 Any用法 数量限定词 数量限定词之 all 和 both Everybody/Everyone 不定代词指代人 不定代词搭配“else”用法 bring It takes time to ... 询问 Would would 主语 like noun/to do? 询问他人意愿 Would you like dinner&#xff…

使用 Unsplash API 生成随机图片

Unsplash 如果你想使用免费版权的图片时&#xff0c;无论你是否用于商业用途&#xff0c;Unsplash 是不错的选择。 我自己也经常用它来制作大型背景图片 虽然他们为开发人员提供了很棒的 API&#xff0c;但他们也提供了通过 URL 访问随机图片的选项。 1. 默认随机 请看这个例子…

ChaoJi充电连接装置典型试验案例分析 GB/T 20234.1充电连接装置型式试验变化分析

GB/T 20234.1充电连接装置典型试验变化分析 1、ChaoJi充电连接装置典型试验案例分析 1.1、大功率直流充电接口 1.2、枪线尺寸、重量、面积数据对比 1.3、枪线温升对比试验 1.4、chaoji 枪线温升试验 1.5、chaoji枪线防护等级试验 1.6、GB/T 20234.4项目列表 1.7、小结 ✓ 通…

GenericServlet 和 HttpServlet

在 Java Web 开发中&#xff0c;GenericServlet 和 HttpServlet 是两个重要的类&#xff0c;用于处理客户端的请求和生成响应。它们是基于 Java Servlet API 的关键组件&#xff0c;为开发人员提供了处理 Web 请求和实现服务器端逻辑的强大工具。 GenericServlet GenericServ…

Failed building wheel for opencv-python which use PEP 517

这主要是opencv-python版本更新以后wheels也更新了&#xff0c;但是相关安装软件没有及时适配&#xff0c;所以不管是使用pip直接安装还是换源其实效果都是报错&#xff0c;解决方法就是直接指定安装旧版opencv-python完事儿&#xff0c;例如&#xff1a; pip3 install opencv…

37. 解数独

题目描述 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; …

H264初探

ref&#xff1a; 【科普】“视频”是怎么来的&#xff1f;H.264、码率这些词又是什么意思&#xff1f;_哔哩哔哩_bilibili H.264编解码原理浅析 - 知乎

基于Java SSM框架+Vue实现旅游资源网站项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现旅游资源网站演示 摘要 本论文主要论述了如何使用JAVA语言开发一个旅游资源网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述旅游…

Elasticsearch:什么是向量数据库?

向量数据库定义 向量数据库是将信息存储为向量的数据库&#xff0c;向量是数据对象的数值表示&#xff0c;也称为向量嵌入。 它利用这些向量嵌入的强大功能来对非结构化数据和半结构化数据&#xff08;例如图像、文本或传感器数据&#xff09;的海量数据集进行索引和搜索。 向…

Linux 性能压测

目录 1、内存 (1) 查看内存指令 (2) 清理缓存 (3) swap分区的作用 2、cpu (1) 查看cpu核心数 (2) 查看cpu使用率 (3) 查看cpu使用百分比 (5) 查看cpu温度 (6) cpu压力测试 3、磁盘 (1) 查看磁盘信息 (2) 数据恢复相关 (3) 查看磁盘io (4) 磁盘压测 1、内存 (1) …

MATLAB Simulink +STM32硬件在环 (HIL)实现例程测试

MATLAB Simulink STM32硬件在环 &#xff08;HIL&#xff09;实现例程测试 &#x1f4cd;相关篇《STM32CubeMxMATLAB Simulink点灯程序》✨本例程没有使用到STM32CubeMX来创建工程&#xff08;在Simulink 中不是选择的STM32xxxbased类型的&#xff09;。 &#x1f516;STM32xxx…

基于SSM的网上手机销售系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

llama.cpp部署通义千问Qwen-14B

llama.cpp是当前最火热的大模型开源推理框架之一&#xff0c;支持了非常多的LLM的量化推理&#xff0c;生态比较完善&#xff0c;是个人学习和使用的首选。最近阿里开源了通义千问大语言模型&#xff0c;在众多榜单上刷榜了&#xff0c;是当前最炙手可热的开源中文大语言模型。…

go语言学习-并发编程(并发并行、线程协程、通道channel)

1、 概念 1.1 并发和并行 并发:具有处理多个任务的能力 (是一个处理器在处理任务)&#xff0c;cpu处理不同的任务会有时间错位&#xff0c;比如有A B 两个任务&#xff0c;某一时间段内在处理A任务&#xff0c;这时A任务需要停止运行一段时间&#xff0c;那么会切换到处理B任…

微服务的应用架构

架构描述的是在更高层次将应用拆分为子系统或模块的方法&#xff0c;以及这些子系统之间的交互关系。在一个基于微服务架构构建的应用中&#xff0c;每个服务都需要有自己的架构。 事实上&#xff0c;单体应用在复杂度较低时&#xff0c;它的生产效率是要高于微服务的。只有在…