iOS--UIPickerView学习

news/2024/7/20 22:29:38 标签: ios, 学习, cocoa

UIPickerView

  • 使用场景和功能
  • UIPickerView
    • 遵循代理协议和数据源协议
    • 创建对象,添加代理
    • 必须实现的代理方法
    • 非必要实现的方法
    • demo用到的其他函数
    • 提示
  • 效果展示

使用场景和功能

UIPickerView 最常见的用途是作为选项选择器,允许用户从多个选项中选择一个。UIPickerView 可以用于以滚动的方式展示大量数据,并允许用户通过滚动选择感兴趣的数据。一种很常见的用法是把各个数据以滚动的形式组成一个组合数据,比如年-月-日的日历或者时钟,以及省级-市级-区的地域 ;
这一部分的学习是参考学长的,用到了学长的plist文件 ;

UIPickerView

这个控件是iOS中自带的控件,使用方法类似于UItableview,所以就从UItableveiw的使用来分析了,这里跟着别人做了一个省级-市级-区的地域的小demo

遵循代理协议和数据源协议

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource>
@property (nonatomic, strong) UIPickerView* pickerview ;
@property (nonatomic, strong) NSMutableArray* provinceArray ;
@property (nonatomic, strong) NSArray* cityArray ;
@property (nonatomic, strong) NSArray* areaArray ;
@end

创建对象,添加代理

self.pickerview = [[UIPickerView alloc] initWithFrame:CGRectMake(50, 100, 300, 200)] ;
    //类似于tableview,需要设置代理和数据源
    self.pickerview.delegate = self ;
    self.pickerview.dataSource = self ;
    [self.view addSubview:self.pickerview] ;

必须实现的代理方法

//组数
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 3;
}
//行数
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    if (component == 0) {
        return [self.provinceArray count];
    } else if (component == 1) {
        return [self.cityArray count];
    } else {
        return [self.areaArray count] ;
    }
}

可以参考Uitableview的行和列,差不多的

非必要实现的方法

//展示的信息,可以是NSSTring,也可以是UIview
//- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
//    return @"chabuduo";
//}
//

//pickerview滑动函数

  • (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

简单常用的上面两个,还有很多其他的代理方法,可以参考UItableview;

UIPickerView 的代理方法用于处理用户的选择操作、自定义选项的外观以及其他与 UIPickerView 相关的事件。以下是一些常用的 UIPickerViewDelegate 和 UIPickerViewDataSource 协议中的代理方法:
UIPickerViewDelegate 协议中的代理方法:
pickerView(:didSelectRow:inComponent:):
当用户选择了 UIPickerView 中的某一行时调用该方法。你可以在该方法中获取选择的行和列索引,并根据需要进行相应的处理。
pickerView(
:viewForRow:forComponent:reusing:):
返回自定义 UIView 对象作为指定行和列的内容视图。你可以使用此方法自定义选项的外观,例如改变文本颜色、字体等。
pickerView(:rowHeightForComponent:):
返回指定列的行高。你可以使用此方法设置特定列的行高,以使选项在 UIPickerView 中正确显示。
UIPickerViewDataSource 协议中的代理方法:
numberOfComponents(in:):
返回 UIPickerView 中的列数(组件数)。你需要在此方法中指定需要显示的列数。
pickerView(
:numberOfRowsInComponent:):
返回指定列中的行数。你需要在此方法中指定每个列的行数,以确定每列将显示多少选项。

demo用到的其他函数

- (void)loadData {
    self.provinceArray = [[NSMutableArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"area.plist" ofType:nil]] ;
    self.cityArray = [[self.provinceArray objectAtIndex:0] objectForKey:@"cities"] ;
    self.areaArray = [[self.cityArray objectAtIndex:0] objectForKey:@"areas"] ;
}
- (UIView*)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
    UILabel* myview = nil ;
    myview = [[UILabel alloc] init] ;
    myview.textAlignment = NSTextAlignmentCenter ;
    myview.font = [UIFont systemFontOfSize:22] ;
    if (component == 0) {
        myview.text = [[self.provinceArray objectAtIndex:row] objectForKey:@"state"] ;
    } else if (component == 1) {
        myview.text = [[self.cityArray objectAtIndex:row] objectForKey:@"city"] ;
    } else {
        myview.text = [self.areaArray objectAtIndex:row] ;
    }
    return myview ;
}
//pickerview滑动函数
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    if (component == 0) {
        self.cityArray = [[self.provinceArray objectAtIndex:row] objectForKey:@"cities"] ;
        [self.pickerview reloadComponent:1] ;
        //调整各组所选的对象
        [self.pickerview selectRow:0 inComponent:1 animated:YES] ;
        if ([self.cityArray count] != 0) {
            self.areaArray = [[self.cityArray objectAtIndex:0] objectForKey:@"areas"] ;
            [self.pickerview reloadComponent:2] ;
            [self.pickerview selectRow:0 inComponent:2 animated:YES] ;
        }
    } else if (component == 1) {
        if ([self.cityArray count] != 0) {
            self.areaArray = [[self.cityArray objectAtIndex:row] objectForKey:@"areas"] ;
            [self.pickerview reloadComponent:2] ;
            [self.pickerview selectRow:0 inComponent:2 animated:YES] ;
        }
    } else {
        
    }
}

提示

其他没啥好说的了,因为用起来真的太像UItableview了,这里简单解释一下滑动函数的逻辑,如果滑动“省”,则更新市和区的component并其row归零;如果滑动“市”,则更新区的component并归零 ;

效果展示

在这里插入图片描述


http://www.niftyadmin.cn/n/5226680.html

相关文章

Android设置文字颜色渐变

项目中用到了很多文字颜色渐变的设计&#xff0c;因此做一下记录。 核心代码如下&#xff1a; /*** 统一文字渐变色设置* param colors 渐变色字符串数组* param positions 渐变色位置数组&#xff0c;可为空* param start 渐变起始点&#xff0c;可为空* param end 渐变结束…

陪诊系统:基于自然语言处理的患者沟通创新

医疗领域的数字化转型正日益引入创新技术&#xff0c;其中基于自然语言处理&#xff08;NLP&#xff09;的陪诊系统成为提升患者沟通的一项关键技术。本文将深入研究这一领域&#xff0c;介绍陪诊系统如何借助NLP实现患者沟通的创新&#xff0c;并提供一个简单的Python代码示例…

世岩清上:元宇宙的互联网技术

元宇宙是一个充满无限可能的虚拟世界&#xff0c;它结合了互联网技术的最新成果&#xff0c;为用户提供了一个全新的、沉浸式的体验。在元宇宙中&#xff0c;互联网技术发挥着至关重要的作用&#xff0c;以下是其中几个方面的应用。 首先&#xff0c;元宇宙的构建需要基于互联…

对 BFC 的理解

对 BFC 的理解 BFC 即 区块格式化上下文&#xff0c;可以理解为一种特殊环境&#xff0c;决定块级盒的布局及浮动影响范围的区域&#xff0c;并附带多项特性&#xff0c;在理解 BFC 之前需要先对&#xff1a; 盒模型块级元素行级元素块级盒行内盒匿名盒定位 进行简单了解 盒…

VUE语法-ref和reactive响应式数据引用

1、响应式概述 在vue中定义一个参数&#xff0c;当这个参数在使用中发生了变化&#xff0c;在页面中对这个数据应用的地方都会同步的发生变化&#xff0c;这个就是数据响应式。 2、创建一个非响应式的参数 该程序中采用的是VUE3的用法&#xff1a; 1、在程序中定义了一个局…

加密挖矿、AI发展刺激算力需求激增!去中心化算力时代已来临!

2009年1月3日&#xff0c;中本聪在芬兰赫尔辛基的一个小型服务器上挖出了比特币的创世区块&#xff0c;并获得了50BTC的出块奖励。自加密货币诞生第一天起&#xff0c;算力一直在行业扮演非常重要的角色。行业对算力的真实需求&#xff0c;也极大推动了芯片厂商的发展&#xff…

【Linux驱动开发】编译Android12源码+

编译Android12源码 1. 简单描述2. 准备资料3. 编译Android12 1. 简单描述 基于讯为电子rk3568教程 2. 准备资料 rk_android12.0_sdk_20220720.tar.gz 3. 编译Android12 解压 tar -vxf rk_android12.0_sdk_20220720.tar.gz设置屏幕配置 rk_android12.0_sdk/kernel-4.19/ar…

深入了解 Docker:容器化技术的颠覆者

引言 Docker 是一项颠覆性的容器化技术&#xff0c;改变了软件开发和部署的方式。它提供了一种轻量级、可移植、自给自足的容器解决方案&#xff0c;使得应用程序能够更加灵活、可靠地运行在不同的环境中。本文将深入介绍 Docker 的原理、优势和应用场景。 Docker 的基本概念…