【iOS控件】—— UIPickerView的使用

news2025/2/27 21:19:37

【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.coloradmin.cn/o/1281472.html

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

相关文章

力扣 --- 最长公共前缀

题目描述&#xff1a; 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"…

Windows安装MySQL8.2

Windows安装MySQL8.2 三种安装模式 默认自定义完整 本案例选择自定义 选择安装目录 勾选 Run MySQL Configurator 配置MYSQL 默认为开发者模式 在 Config Type 下拉列表中选择数据中心 设置 root 账号密码

【算法】前后缀分解题单⭐

文章目录 题单来源题目列表42. 接雨水238. 除自身以外数组的乘积2256. 最小平均差2483. 商店的最少代价代码1——前后缀数组代码2—— O ( 1 ) O(1) O(1)空间&#x1f402; 2420. 找到所有好下标2167. 移除所有载有违禁货物车厢所需的最少时间代码1——前后缀分解代码2——简洁…

题目:神奇的进制

解题思路&#xff1a; 用电脑自带的计算器&#xff0c;切换到程序员模式。里面有进制转换功能。 由题目&#xff0c;要求严格递增且都为字母&#xff0c;还要大于2023&#xff0c;则数字16进制为ABC。

wvp gb28181 pro 平台国标级连功能说明

国标28181不同平台之间支持两种连接方式&#xff0c;平级和上下级&#xff0c;WVP目前支持向上级级联。 测试环境 测试平台上级&#xff1a;192.168.10.209&#xff08;Alam centos8&#xff09; 测试平台下级&#xff1a;192.168.10.206&#xff08;ky10_x86&#xff09; 下级…

安装错误_ImportError: cannot import name ‘XXX‘循环引用 绕晕TT(deepsolo)

这里写目录标题 error: Couldnt find a setup script in /tmp/easy_install-lfpvj6p4/scikit_image-0.22.0.tar.gzpip install -v -e . 和 python setup.py develop功能一样吗AttributeError: module ‘PIL.Image’ has no attribute ‘LINEAR’ImportError: cannot import nam…

计算机网络 | 物理层下 传输媒介、信道复用技术,带宽接入技术

文章目录 3. 物理层下面的传输媒介3.1 导引型传输媒介3.2 非导引型传输媒介 4 信道复用技术5 数字传输系统5.1 旧的数字系统5.2 新数字系统 6 带宽接入技术6.1 DSL&#xff08;数字用户线&#xff09;6.2HFC 光纤同轴混合网6.2.1 接入 6.3 FTTx技术 3. 物理层下面的传输媒介 传…

Pandas进阶:拼接 concat 使用方法

1.处理索引和轴 假设我们有2个关于考试成绩的数据集。 df1 pd.DataFrame&#xff08;{ name&#xff1a;[A&#xff0c;B&#xff0c;C&#xff0c;D]&#xff0c;math&#xff1a;[60,89,82,70]&#xff0c;physics&#xff1a;[66&#xff0c; 95,83,66]&#xff0c;chemi…

探究两个互联网时代的差异,Web 2.0 与 Web 3.0 区别

Web 2.0 的特征 首先我们来了解一下 Web 2.0 的特征都有哪些。 用户生成内容&#xff1a;Web 2.0 时代以用户生成内容为特征&#xff0c;用户可以轻松地在网络上分享、创建和编辑信息。社交媒体平台、博客等网站的兴起使得用户成为信息的创造者&#xff0c;网络逐渐从被动浏览…

04-数据库操作对象Statement对象和PreparedStatement对象的区别,SQL注入的优缺点

Statement对象和查询结果集 Statement对象相关的方法 Connection接口中获取数据库操作对象Statement对象的方法 方法名功能Statement createStatement()创建Statement对象 Statement对象执行增删改查的SQL语句(不含占位符"?")的方法,JDBC中的SQL语句不需要提供分…

【开源】基于JAVA的医院门诊预约挂号系统

项目编号&#xff1a; S 033 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S033&#xff0c;文末获取源码。} 项目编号&#xff1a;S033&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2…

【RotorS仿真系列】Ardrone模型介绍

ardrone是rotors仿真框架提供的一款机型&#xff0c;因为该机型与我们实际使用的机型参数相近&#xff0c;所以这里对它的参数做特别整理和记录。 一、模型参数总结 ardrone的gazebo模型如下图所示&#xff1a; 根据ardrone.yaml&#xff0c;其关键参数如下所示&#xff1a…

Python基础快速过一遍

文章目录 一、变量及基本概念1、变量2、变量类型3、变量格式化输出4、type()函数5、input()函数6、类型转换函数7、注释 二、Python运算/字符1、算数运算2、比较运算3、逻辑运算4、赋值运算符5、转义字符6、成员运算符 三、判断/循环语句1、if判断语句2、while循环语句3、for循…

51单片机应用从零开始(九)·数组

目录 1. 用字符型数组控制 P0 口 8 位 LED 流水点亮 2. 用 P0 口显示字符串常量 1. 用字符型数组控制 P0 口 8 位 LED 流水点亮 C语言中的字符型数组是一种数据类型&#xff0c;它是一个由字符组成的序列&#xff0c;以空字符\0结尾。在声明字符型数组时&#xff0c;需要指…

总结react中css的使用

1、css in js css in js有很多库&#xff0c;这里介绍styled-components styled-components 下载【vscode可以安装vscode-styled-components 插件&#xff0c;有代码提示】 npm i styled-components 1、然后为某个组件新建style.js文件&#xff0c;然后写一些样式。 impo…

SpringAMQP入门案例——发送消息

依赖 <!--SpringAMQP起步依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> yml配置文件 自行修改 spring:rabbitmq:host: 192.168.220.130 # …

【力扣】——可获得的最大点数(滑动窗口)

几张卡牌 排成一行&#xff0c;每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动&#xff0c;你可以从行的开头或者末尾拿一张卡牌&#xff0c;最终你必须正好拿 k 张卡牌。 你的点数就是你拿到手中的所有卡牌的点数之和。 给你一个整数数组 cardPoi…

「C++」C++11新特性

&#x1f4bb;文章目录 &#x1f4c4;前言右值引用概念右值引用的意义 lambada表达式包装器function包装器bind包装器 &#x1f4d3;总结 &#x1f4c4;前言 C标准10年磨一剑&#xff0c;于2011年迎来了它真正意义上的第二个标准&#xff0c;C11能更好地适用与系统开发和库开发…

高校人员信息管理系统C++

代码&#xff1a;https://mbd.pub/o/bread/ZZeZk5lx 一、基本内容论述 1、问题描述 某高校有四类员工&#xff1a;教师、实验员、行政人员、教师兼行政人员&#xff1b;共有的信息包括&#xff1a;编号、姓名、性别、年龄等。其中&#xff0c;教师还包含的信息有&#xff1a;所…

实现一个简单的网络通信下(udp)

时间过去好久了&#xff0c;先回忆一下上一篇博客的代码&#xff01;&#xff01; 目前来看&#xff0c;我们客户端发一条消息&#xff0c;我服务器收到这一条消息之后呢&#xff0c;服务器也知道了是谁给我发来的消息&#xff0c;紧接这就把这条消息放进buffer当中&#xff0c…