[IOS]今天开始学UI---UIPickerView

iOS系列UI篇——UIDatePicker和UIPickerView 这两个控件长相类似,所以放在一起了!这两个控件多半是在填写注册人信息,收货地址等等页面,所以几乎每个项目都可能用到。 首先看一下UIDatePicker——时间选择器。上代码!#import "ViewController.h" #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width #define SCREEN_HEIGHT [ 阅读详情

UIPickerView和UIDatePickerView很类似

也许你会想UIDatePickerView是继承自UIPickerView

但是并非如此UIDatePickerView持有UIPickerView 并对其进行了一些个性化


UIPickerView的效果如下图


由若干个滚轮组成(numberOfRowsInComponent),每个滚轮都有一些列的条目

便于选择复合选项


要在当前的View中添加UIPickerView则需要遵循其UIPickerViewDataSource, UIPickerViewDelegate两项协议

UIPickerViewDataSource 负责的是构建一个UIPickerView的最基本信息 数据源 (比如多少个滚轮,每个滚轮多少行)

UIPickerViewDelegate 负责的则是UIPickerView视图效果 一些行为操作代理 (比如滚轮的宽度,滚轮上显示的字,是否选中某值)


构建一个UIPickerView需要遵从的最基础协议定义在UIPickerViewDateSource 主要有两个方法需要实现:

@protocol UIPickerViewDataSource<NSObject>
@required

// returns the number of 'columns' to display.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;

// returns the # of rows in each component..
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
@end

第一个返回多少个滚轮组建,第二个怎时返回每个组建上有多少行


当以上两个方法实现后如果 没有实现UIPickerViewDelegate中的某些个方法 你看的效果嗯 大概就是没有加特技那样

你可以选择性的实现以下中的方法一个

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component 
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view;
分别是提供一般的字符,属性字,或者自定义view 到滚轮中的某个row

让他们看起来比较的cooooool


所以代码如下

@interface ViewController ()<UIPickerViewDataSource,UIPickerViewDelegate>
@property (nonatomic,strong) UIPickerView *pickerView;
@property (nonatomic,strong) NSArray *singers;
@property (nonatomic,strong) NSArray *songs;
@property (nonatomic,strong) NSDictionary *dic;
@property (nonatomic,strong) UILabel *currentSelected;
@end
实现两个协议,并持有两个数组用来存放第一个滚轮显示的字符串singers songs dic 则是维系singers 和songs 关系  currentSelected显示当前所选择情况


- (void)viewDidLoad {
    [super viewDidLoad];
    //init source data
    NSString *path=[[NSBundle mainBundle] pathForResource:@"Songs" ofType:@"plist"];
    _dic = [NSDictionary dictionaryWithContentsOfFile:path];
    _singers = [_dic allKeys];
    NSInteger selectedSingerIndex = [self.pickerView selectedRowInComponent:0];
    NSString *selectedSinger = [_singers objectAtIndex:selectedSingerIndex];
    _songs = [_dic objectForKey:selectedSinger];
    _pickerView = [[UIPickerView alloc] init];
    _pickerView.center = self.view.center;
    _pickerView.dataSource = self;
    _pickerView.delegate = self;
    self.view.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:_pickerView];
    _currentSelected = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 50)];
    _currentSelected.center = CGPointMake(self.view.center.x, self.view.center.y-200);
    [_currentSelected setText:[NSString stringWithFormat:@"%@  %@",[_singers objectAtIndex:0],[_songs objectAtIndex:0]]];
    [_currentSelected setTextAlignment:NSTextAlignmentCenter];
    [self.view addSubview:_currentSelected];


}


初始化数据源 UIPikcerView当前的选中状态

必要实现部分

#pragma mark required method
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    return 2;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    if (component == 0) {
        return  [_singers count];
    }else{
        return [_songs count];
    }
}

共2个滚轮组建 每个组分别有 [_singers count] 和[_songs count] 行

这里滚轮的组建是有编号的 从0开始 每多一个滚轮组建就+1 

当构建UIPickerView的Row视图时 传入当前组建滚轮的编号 然后得到该组建的Row 的个数 所以需要判断component是多少



#pragma mark optional method
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    if (component == 0) {
        NSString* selectedSinger=[_singers  objectAtIndex:row];
        NSArray* array=[_dic objectForKey:selectedSinger];
        _songs=array;
        //选择指定的item
        [self.pickerView selectRow:0 inComponent:1 animated:YES];
        //刷新指定列中的行
        [self.pickerView reloadComponent:1];

    }
    [self updateLabel:pickerView];
}

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    if (component == 0) {
        return  [_singers objectAtIndex:row];
    }else {
        return [_songs objectAtIndex:row];
    }
}
#pragma mark self-defined method
-(void)updateLabel:(UIPickerView *)pickerView{
    NSInteger singerRow=[pickerView selectedRowInComponent:0];
    NSInteger songRow=[pickerView selectedRowInComponent:1];
    NSString* selectedSinger=[_singers objectAtIndex:singerRow];
    NSString* selectedSong=[_songs objectAtIndex:songRow];
    [_currentSelected setText:[NSString stringWithFormat:@"%@  %@",selectedSinger,selectedSong]];
}


这里我们需要根据滚轮0 的选择 来刷新 滚轮 1的状态

而选择滚轮1 的时候不刷新任何状态,所以在

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component;中

仅判断滚轮是否为0

同时刷新数据源 和选择状态


最后调用自定义方法 更新UILabel显示的内容






that's all

thx


Everything you see on Screen is UIView.



[AFNetworking]源代码分析--AFURLRequestSerialization.h 阅读详情

相关推荐

保姆级教程:用STM32H743+TJA1042T玩转FDCAN,CubeMX配置1M/5M双速率通信(附完整代码)

本文提供STM32H743与TJA1042T实现FDCAN双速率通信的保姆级教程,详细讲解CubeMX配置1M/5M双速率通信的全过程,包括硬件连接、时钟树配置、过滤器设置及中断管理,并附完整代码示例,助力开发者快速掌握FDCAN高速通信技术。

weixin_30698297的博客 473

IOS第十六天——基本控件

51假期,大家一般都会比较轻松吧,好吧,表示我苦逼哈哈地在家写代码,除了要写一个小型的管理系统之外还要继续学习IOS开发,不过话说回来,日子过的也很充实。那么,今天我们就来看一下IOS开发中的基本控件。 1. UIView和控件 UIKit所有的基本控件都是UIView的子类,UIView是所有控件的基础。UIView继承自UIResponder,而UIResponder则继承自根类NSObj

jeepxiaozi的专栏 1339

从零开始安装使用opengauss数据库(高斯数据库)

openGauss(高斯数据库)的环境配置、安装方法、基本使用方法

qq_43764807的博客 1万+

PJPickerView 组件开发总结

今天周日继续撸码,继续完成另一个组件,给之取名为——PJPickerView,别以为它真的只是个View 哦,为了让它看上去显得不是太“重”,从而取了这个名字,本质上是个 UIViewController,可能你会觉得有些奇怪,为什么一个组件要上 UIViewController 呢?刚开始我也不想这么玩,听我慢慢道来。 UI 还是先来看 UI, UI 已经画得十分清楚了,就是要让我们分离出一个...

weixin_34221332的博客 151

OPC DCOM详细配置方法 - 不关防火墙不换登陆用户

1. 前言   OPC DCOM的设置是实现跨网络OPC通信的基础,现有的一些OPC DCOM配置教程虽然讲解了如何配置DCOM,但没有讲清楚为什么要这么做,而且各个教程涉及的配置方法也不尽相同。   为了彻底搞清楚OPC DCOM的配置过程,我重新做了两台机器的系统,一台是Windows 7 32位,一台是Windows 10 64位,并且重零开始完整的测试了正常运行OPC DCOM所需的最少的...

steventian72的博客 3万+

用了7年的 source insight 3.5 背景色及字体配置(提升code效率)

在此记录并share用了7年的 source insight 3.5 背景色及字体配置,提升阅读代码效率

Chasing Freedom 7523

IQActionSheetPickerView:简洁高效的UIPicker选择器

IQActionSheetPickerView:简洁高效的UIPicker选择器 在iOS应用开发中,提升用户体验往往体现在那些看似微小实则重要的细节上。今天,我们要向您推荐一个开源项目——IQActionSheetPickerView,它正是这些细节中的佼佼者,能够帮助开发者快速集成优雅的行动表单选择器。 项目介绍 IQActionSheetPickerView是一个轻量级的Objective-...

gitblog_00353的博客 367

YOLO26-seg分割优化:FPN涨点&轻量化篇 |多级特征融合金字塔(HS-FPN),助力小目标检测

​​​​​摘要:本研究对Ultralytics YOLO26进行了全面分析,重点阐述了其关键架构改进及其在实时边缘目标检测中的性能基准测试。YOLO26于2025年9月发布,是YOLO系列最新、最先进的成员,专为在边缘及低功耗设备上实现高效、精确且易于部署的目标而构建。本文依次详述了YOLO26的架构创新,包括:移除了分布焦点损失(DFL);采用端到端的无NMS推理;集成了渐进损失(ProgLoss)与小目标感知标签分配(STAL);以及引入了用于稳定收敛的MuSGD优化器。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 280

Android省市区三级联动滚轮选择

最近项目要做一个,类似淘宝手机客户端的,选择收货地址的三级联动滚动选择组件,下面是它的大致界面截图: 在iOS中有个叫UIPickerView的选择器,并且在dataSource中定义了UIPickerView的数据源和定制内容,所以用只要熟悉它的基本用法,要实现这么个三级联动滑动选择是挺简单的。  言归正传,今天讨论的是在Android里面如何来实现这么个效果

Briup-z.changhai 1178

【肌电处理】肌电信号EMG积分肌电值+均方根值+中值频率+平均功率频率【含Matlab源码 3386期】

肌电信号EMG积分肌电值+均方根值+中值频率+平均功率频率 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 821

Python白色飘雪(完整代码)

Python绘制白色飘雪动画的完整代码。

AIGC 3万+

macdowsOS Tool 1.30:一键将Windows深度美化成macOS风格

系统主题定制与桌面环境美化是提升用户体验和工作效率的常见需求,尤其在跨平台工作场景中。其原理通常涉及修改系统资源文件、注册表项以及注入动态链接库等技术,在保留原生系统内核与性能的前提下,实现视觉风格与交互逻辑的深度仿制。这类技术的核心价值在于,它能极大地降低用户手动配置的风险与复杂度,通过模块化、自动化的方式,提供稳定、统一的美化效果。在应用场景上,特别适合需要频繁在macOS与Windows间切换的开发者、设计师,以及对桌面美学有较高要求的极客用户。macdowsOS Tool 1.30版本正是这样一款全

weixin_30765577的博客 366

LPDDR6 技术标准详解(JESD209-6)

是继 LPDDR5/5X 之后的新一代低功耗 DRAM 标准,专为满足移动终端、AI、边缘计算等高带宽、低功耗场景而设计。该标准通过全新架构、动态功耗控制机制和增强型数据完整性机制,实现性能、能效与可靠性的全面升级。LPDDR6 并非仅是速度升级,更是内存架构设计思路的演进,围绕“低功耗 + 高带宽 + 强安全”的三维目标,构建下一代 SoC 平台关键基础。✅ 高带宽:支持 32B/64B 动态突发✅ 低功耗:动态电压、通道切换✅ 高可靠性:ECC + 自测试 + 安全区。

weixin_43199439的博客 2569

Gyroflow终极指南:如何利用陀螺仪数据实现专业级视频防抖

你是否曾经拍摄过令人兴奋的户外运动视频,却发现画面抖动得让人头晕?或者用手机记录重要时刻,却因为手部晃动毁了珍贵记忆?今天我要介绍一款革命性的开源工具——Gyroflow,它利用相机内置的陀螺仪数据,让普通用户也能轻松实现专业级的视频稳定效果。这款免费工具已经成为无数视频创作者和运动爱好者的秘密武器,现在让我们一起探索它的强大功能。 ## 为什么Gyroflow是视频防抖的最佳选择? 传统视频

gitblog_01112的博客 368

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

保姆级教程:用C#和OpenCvSharp3打造一个带暂停/继续功能的简易录像机

本文详细介绍了如何使用C#和OpenCvSharp3开发一个带暂停/继续功能的工业级录像系统。通过状态机设计、视频分段存储策略和硬件编码加速等关键技术,实现高效稳定的视频录制,适用于工业质检、在线教育等场景。

weixin_30800807的博客 252

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

[IOS]今天开始学UI---UIIView的transform和contentMode属性

UIView transform和contentMode属性

HeapStackk的博客 1109

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[IOS]今天开始学UI---UIButton with NumberMatch Game

UIButton 浅析

HeapStackk的博客 1066

[IOS]今天开始学UI---UIProgressView

UIProgressView 浅析

HeapStackk的博客 1001

[IOS]今天开始学UI---NSAttributedString 属性字

属性字 简析

HeapStackk的博客 934

[IOS]今天开始学UI---UIDatePicker

UIDatePicker浅析

HeapStackk的博客 838

[IOS]今天开始学UI---UISegmentedControl&&UIStepper

UISegmentControl 浅析

HeapStackk的博客 819

[IOS]今天开始学UI---UIAlertController

UIAlertController 主要是给用户显示警告⚠信息  本来想讲的是UIAlertView 但是根据最新IOS 8官方文档 UIAlertView已经废弃了 而是采用UIAlertController实现上述目的 在iOS 8中,UIAlertController在功能上整合了UIAlertView以及UIActionSheet,UIAlertController以一种模块化替

HeapStackk的博客 784

[IOS]今天开始学UI---UIActivityIndicatorView

UIActivityIndicatorView简单介绍 应该是最简单的一个UIView了吧

HeapStackk的博客 711

[IOS]今天开始学UI---Autolayout

AutoLayout 和VFL

HeapStackk的博客 705

[IOS]今天开始学UI---UIImageView

UIImageView 浅析

HeapStackk的博客 627
上一篇: [IOS]今天开始学UI---UIPageControl
下一篇: [IOS]今天开始学UI---UIProgressView
HeapStackk
博客等级 码龄12年 11粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值