【iOS开发】-UIPickerView

news2025/1/17 4:02:12

写在开头

  • 昨天学习了iOS一个简单的控件。 UIPickerView;
    请添加图片描述
  • UIPickerView组件类似HTML都Select组件效果,提供数据供用户选择。可以通过plist文件提供数据。UIPickerView是一个选择器控件,可以生成单列的选择器,也可以生成多列的选择器,而且开发者完全可以自定义选择项的外观,用法十分灵活。UIPickerView直接继承了UIView,没有继承UIControl,因此,它不能像UIControl那样绑定事件处理方法,UIPickerView的事件处理由其委托对象完成
  • 类似于上面的闹钟实现,UIPickerView也是有自己的代理方法和数据源。

UIPickerView实现简单的demo

  • 要实现的代理请添加图片描述
  • UIPickerViewDataSource的方法
  • 协议中有两个必须实现的方法-分别是设置选择器的行和列数
    请添加图片描述
  • UIPickerViewDelegate
返回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 *)

  • 既然有数据源,那参考UITableView就有reloadData方法
- (void)reloadAllComponents;
- (void)reloadComponent:(NSInteger)component;

DEMO实现

请添加图片描述

  • 我实现了3个列表的联动,第一个列表代表了组别,第二个列表对应第一个列表的内容,滑动第一个列表会出发delegate事件,刷新数据
  • m文件的实现
#import "ViewController.h"

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

@implementation ViewController

请添加图片描述

  • 初始化pickerView
 self.pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, [UIScreen mainScreen].bounds.size.height - 220, [UIScreen mainScreen].bounds.size.width, 200)];
    self.pickerView.delegate = self;
    self.pickerView.dataSource = self;
  • 初始化数组
self.directionArray = @[@"EDG", @"NBA", @"Bro", @"OS"];
    self.nameArray1 = @[@"Flander", @"Jiejie", @"Scout", @"Viper", @"Mekio", @"ClearLove"];
    self.nameArray2 = @[@"KingJames", @"Curry", @"Jordan", @"Durant", @"Harden"];
    self.nameArray3 = @[@"LdQ", @"ScMokey", @"HJC"];
    self.nameArray4 = @[@"MacOS", @"iOS", @"WatchOS", @"PadOS"];
    self.endArray = @[@"LOL", @"Stars", @"Friends", @"Study"];
    self.Dict = @[_nameArray1, _nameArray2, _nameArray3, _nameArray4];
  • 数据源实现
  • 返回3组 代表了3个列表,对于- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component方法,我的参考是component和tableview的indexpath的section一样,对于第一个列表component == 0返回第一列的长度

请添加图片描述

  • Delegate实现
  • - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 类似于tableview的返回indexpath的对应内容的方法
// 滑动触发事件
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    // 使用一个UIAlertView来显示用户选中的列表项
    if (component == 0) {
        self.currentNameArray = 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.currentNameArray[row]);
    }
}
  • 如何实现滑动第一个列表刷新第二个列表,如上述代码,在滑动component的时候刷新第二个列表和请添加图片描述
  • 对于代码里面的[self.pickerView selectRow:0 inComponent:1 animated:YES]; [self.pickerView selectRow:0 inComponent:2 animated:YES];方法,就是在滑动刷新完之后是否让回到row = 0的内容,animated即是是否开启动画效果
  • 返回列表内容的函数
// 返回列表的内容
#pragma mark UIPickerViewDelegate;
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
//    NSLog(@"%@", self.directionArray[row]);
    if (component == 0) {
        return self.directionArray[row];
    } else if (component == 1){
        return  self.currentNameArray[row];
    } else {
        return  self.currentEndString;
    }
}
// 返回列表的宽度
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
    return 130;
}

总结

  • 很简单但是很实用的控件,在项目里也许会用到

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

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

相关文章

【待解决】Not a Prefab scene

开发平台:Unity 2018.4.10f1 编程平台:Visual Studio   问题描述 注意:这是一个 意义不明 的报错内容。   问题发生环境(可能不唯一) 在 Unity 2018版本中,编辑场景内已有预制体的游戏对象时发生的问题…

stm32cubemx hal学习记录:FreeRTOS消息队列

一、基本介绍 1、消息队列就是一个像容器一样的东西,我们所有的任务都可以往内部写,然后队列会将我们的消息按顺序存下来,所有的任务也可以按顺序将其读出来。 2、队列需要明确数据的大小以及队列的长度,写队列和读队列都是采用…

16.面试重点CookieSession

一、文件上传(使用频率高,但不是很重要) 1.通过form表单 前端: form表单,method必须是POST, enctype属性是multipart/form-data, type是file 引起HTTP请求体的格式以multipart的形式传输 后端: 正常…

UnRaid虚拟机安装Uos家庭版并由Windows远程桌面访问的成功流程

文章目录0、前言1、UnRaid虚拟机安装Uos家庭版1.1、下载Uos系统镜像1.1.1、在https://home.uniontech.com/官网下载镜像安装包(如下图:)1.1.2、上传至Unraid1.1.3、添加虚拟机1.1.4、激活Uos家庭版2、开启Uos的远程桌面2.1、为Uos安装xrdp服务…

【制作数字人】零门槛通过三维重建技术生成个人三维模型

依托各项技术的发展,数字人技术开始拔地而起。我们发现,各大一线互联网企业、三大运营商,还有不少创业型公司都纷纷入局数字人。 难道元宇宙的入门票是数字人?等不及了,马上接触下这门技术。经简单了解,现…

前端学习路线(三)

往期回顾↓↓↓ 前端学习路线(一) 前端学习路线(二) 在前两章中,我们讲了如何去学习前端三剑客、js高级和bootstrap的重点,得到了很多前端初学者的好评,收藏量也是每天都在增加,所以…

【身份证识别】基于matlab GUI BP神经网络身份证识别【含Matlab源码 2239期】

⛄一、身份证号码识别简介 1 引言 当今是一个信息高度发达的时代,对于每个公民而言身份证那一连串的数字体现了个人信息的唯一性,出于保障公民合法权益和社会治安的考虑,越来越多的行业都开始建立自己的安全保障体系,其中最为关键…

STA:虚拟时钟(virtual clock)与I/O延时约束

1.什么是虚拟时钟? 虚拟时钟(virtual clock)是存在但没有clock source(pin/port)定义的时钟,仅作为输入输出端口延时约束的参考时钟。定义方式如下例: create_clock -name virtual_clock -period 10 -waveform {0 5} &#xff1…

第四章:Spring七大核心模块Bean、Core、Context

Spring框架七大模块 容器模块(spring core)、应用上下文模块(spring context)、AOP模块(spring aop)、JDBC抽象和DAO模块(spring dao)、对象/关系映射集成模块(spring o…

R3LIVE代码详解(三)

0. 简介 在上一章中,我们过完了主函数以及LIO的操作,由于这部分代码在FAST-LIO2中已经充分详细的介绍过了,所以说这里在R3LIVE中就不过多介绍了,下面我们来看一下本系列的重点,即VIO部分。 1. 主函数 我们在之前分析…

美国访问学者申请|J1签证官方指定材料大全

美国访问学者申请需要哪些材料?下面就随知识人网老师一起来看一看J1签证官方指定材料大全。 一、 有效护照:如果您的护照将在距您预计抵美日期的六个月内过期、或已损坏、或护照上已无空白的签证签发页, 请在前来面谈之前先申请一本新护照。 二、DS-160…

leetcode:1957. 删除字符使字符串变好

难度:简单 一个字符串如果没有 三个连续 相同字符,那么它就是一个 好字符串 。 给你一个字符串 s ,请你从 s 删除 最少 的字符,使它变成一个 好字符串 。 请你返回删除后的字符串。题目数据保证答案总是 唯一的 。 示例 1&#xf…

Podman 部署私有镜像仓库

Podman 部署私有镜像仓库 文章目录Podman 部署私有镜像仓库1. 安装 Podman 和 httpd-tools2. 配置仓库存储位置3. 生成访问仓库的凭据3.1 htpasswd 用户名和密码3.2 TLS 密钥对4. 启动容器5. 测试5.1 登陆5.2 API访问5.3 镜像入库5.4 查询镜像信息Podman是一个无守护进程的开源…

JavaScript基础(14)_in、hasOwnProperty、instanceof的用法、垃圾回收

in 用法:检查对象和原型对象是否含有该属性。 语法:"属性名" in 对象名 hasOwnProperty 用法:检查对象自身是否含有该属性。 语法:对象名.hasOwnProperty("属性名") instanceof 用法:检查一个对…

在裸机上输出Hello,world! [rCore-lab1]

引言 非常简单的“Hello, world”应用程序,实际上有着多层硬件和软件工具和支撑环境隐藏在它背后,才让我们不必付出那么多努力就能够创造出功能强大的应用程序。生成应用程序二进制执行代码所依赖的是以 编译器 为主的开发环境;运行应用程序执行码所依赖…

寻找更好的分类模型loss

寻找更好的loss1.CE loss并不完美2.可能更好的loss函数2.1 CC-LOSS2.2 Center-LOSS参考文献1.CE loss并不完美 最常用于深度学习分类模型的损失函数可以说就是CE(交叉熵) loss了。正如CC-LOSS paper中所述,该loss更关注各类是否separated,而非不同类之间…

Zookeeper:实现“通知协调”的 Demo

应用配置集中到节点上,应用启动时主动获取,并在节点上注册一个 watcher,每次配置更新都会通知到应用。数据发布/订阅(Publish/Subscribe)系统,即所谓的配置中心,顾名思义就是发布者将数据发布到…

[机器翻译]——pivot-based zero-shot translation based on fairseq

文章目录前言翻译到en生成"伪"的、到英语的数据文件把每一个zs语言对翻译到en从fairseq-generate生成的文件中,抽取纯en文件把en数据和所有zs语言对的tgt数据形成平行语料,然后做预处理形成en到tgt的平行语料预处理在en到tgt语言的"伪&qu…

IMC附录A

目录 A.1 恒等式与不等式 THEOREM A.1 (Binomial expansion theorem) PROPOSITION A.2 PROPOSITION A.3 PROPOSITION A.4 A.2 渐进符号 DEFINITION A.5 A.3 概率论基础 PROPOSITION A.7 (Union Bound) THEOREM A.8 (Bayes’ Theorem) PROPOSITION A.9 PROPOSITI…

图扑 Web SCADA 零代码组态水泥生产工艺流程 HMI

水泥是建筑工业三大基本材料之一,素有“建筑工业的粮食”之称。2022 年 1-9 月水泥产量为 15.63 亿吨,生产方法包括新型干法、立窑、湿窑、干法中空窑和立波尔窑等。 水泥生产线链条长、关键环节多的特性要求执行严密的流程监控。图扑软件大屏组态、UI 组…