UIDatePicker 选择月份和年份

2023-12-08

我需要一个UIDatePicker仅用于选择月份和年份。我检查了课程参考文档。好像UIDatePicker is a UIView。我想象UIPickerView可能是一个子视图,如果我能抓住它,我可以隐藏该组件。但不是。那是不可能的。那么我必须创建自己的自定义选择器吗?有任何想法吗?


这是获得相同效果的解决方案。要使用这段代码,您应该替换UIPickerView to CDatePickerViewEx在“身份检查器”的“自定义类”的 nib 文件中。

.h file

#import <UIKit/UIKit.h>

@interface CDatePickerViewEx : UIPickerView <UIPickerViewDelegate, UIPickerViewDataSource> 

@property (nonatomic, strong, readonly) NSDate *date;
-(void)selectToday;

@end

.m file

#import "CDatePickerViewEx.h"

// Identifiers of components
#define MONTH ( 0 )
#define YEAR ( 1 )    

// Identifies for component views
#define LABEL_TAG 43


@interface CDatePickerViewEx()

@property (nonatomic, strong) NSIndexPath *todayIndexPath;
@property (nonatomic, strong) NSArray *months;
@property (nonatomic, strong) NSArray *years;

-(NSArray *)nameOfYears;
-(NSArray *)nameOfMonths;
-(CGFloat)componentWidth;

-(UILabel *)labelForComponent:(NSInteger)component selected:(BOOL)selected;
-(NSString *)titleForRow:(NSInteger)row forComponent:(NSInteger)component;
-(NSIndexPath *)todayPath;
-(NSInteger)bigRowMonthCount;
-(NSInteger)bigRowYearCount;
-(NSString *)currentMonthName;
-(NSString *)currentYearName;

@end

@implementation CDatePickerViewEx

const NSInteger bigRowCount = 1000; 
const NSInteger minYear = 2008;
const NSInteger maxYear = 2030;
const CGFloat rowHeight = 44.f;
const NSInteger numberOfComponents = 2;

@synthesize todayIndexPath;
@synthesize months;
@synthesize years = _years;

-(void)awakeFromNib
{
    [super awakeFromNib];

    self.months = [self nameOfMonths];
    self.years = [self nameOfYears];
    self.todayIndexPath = [self todayPath];

    self.delegate = self;
    self.dataSource = self;

    [self selectToday];
}

-(NSDate *)date
{
    NSInteger monthCount = [self.months count];
    NSString *month = [self.months objectAtIndex:([self selectedRowInComponent:MONTH] % monthCount)];

    NSInteger yearCount = [self.years count];
    NSString *year = [self.years objectAtIndex:([self selectedRowInComponent:YEAR] % yearCount)];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"MMMM:yyyy"];
    NSDate *date = [formatter dateFromString:[NSString stringWithFormat:@"%@:%@", month, year]];
    return date;
}

#pragma mark - UIPickerViewDelegate
-(CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
{
    return [self componentWidth];
}

-(UIView *)pickerView: (UIPickerView *)pickerView
            viewForRow: (NSInteger)row
          forComponent: (NSInteger)component
           reusingView: (UIView *)view
{   
    BOOL selected = NO;    
    if(component == MONTH)
    {
        NSInteger monthCount = [self.months count];
        NSString *monthName = [self.months objectAtIndex:(row % monthCount)]; 
        NSString *currentMonthName = [self currentMonthName];
        if([monthName isEqualToString:currentMonthName] == YES)
        {
            selected = YES;
        }
    }
    else
    {
        NSInteger yearCount = [self.years count];
        NSString *yearName = [self.years objectAtIndex:(row % yearCount)];
        NSString *currenrYearName  = [self currentYearName];
        if([yearName isEqualToString:currenrYearName] == YES)
        {
            selected = YES;
        }
    }

    UILabel *returnView = nil;
    if(view.tag == LABEL_TAG)
    {
        returnView = (UILabel *)view;
    }
    else 
    {
        returnView = [self labelForComponent: component selected: selected];
    }

    returnView.textColor = selected ? [UIColor blueColor] : [UIColor blackColor];
    returnView.text = [self titleForRow:row forComponent:component];
    return returnView;
}

-(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
    return rowHeight;
}

#pragma mark - UIPickerViewDataSource
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return numberOfComponents;
}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if(component == MONTH)
    {
        return [self bigRowMonthCount];
    }
    return [self bigRowYearCount];
}

#pragma mark - Util
-(NSInteger)bigRowMonthCount
{
    return [self.months count]  * bigRowCount;
}

-(NSInteger)bigRowYearCount
{
    return [self.years count]  * bigRowCount;
}

-(CGFloat)componentWidth
{
    return self.bounds.size.width / numberOfComponents;
}

-(NSString *)titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if(component == MONTH)
    {
        NSInteger monthCount = [self.months count];
        return [self.months objectAtIndex:(row % monthCount)]; 
    }
    NSInteger yearCount = [self.years count];
    return [self.years objectAtIndex:(row % yearCount)];
}

-(UILabel *)labelForComponent:(NSInteger)component selected:(BOOL)selected
{
    CGRect frame = CGRectMake(0.f, 0.f, [self componentWidth],rowHeight);

    UILabel *label = [[UILabel alloc] initWithFrame:frame];
    label.textAlignment = UITextAlignmentCenter;
    label.backgroundColor = [UIColor clearColor];
    label.textColor = selected ? [UIColor blueColor] : [UIColor blackColor];
    label.font = [UIFont boldSystemFontOfSize:18.f];
    label.userInteractionEnabled = NO;

    label.tag = LABEL_TAG;

    return label;
}

-(NSArray *)nameOfMonths
{    
    NSDateFormatter *dateFormatter = [NSDateFormatter new];
    return [dateFormatter standaloneMonthSymbols];
}

-(NSArray *)nameOfYears
{
    NSMutableArray *years = [NSMutableArray array];

    for(NSInteger year = minYear; year <= maxYear; year++) 
    {
        NSString *yearStr = [NSString stringWithFormat:@"%i", year];
        [years addObject:yearStr];
    }
    return years;
}

-(void)selectToday
{
    [self selectRow: self.todayIndexPath.row
        inComponent: MONTH
           animated: NO];

    [self selectRow: self.todayIndexPath.section
        inComponent: YEAR
           animated: NO];
}

-(NSIndexPath *)todayPath // row - month ; section - year
{
    CGFloat row = 0.f;
    CGFloat section = 0.f;

    NSString *month = [self currentMonthName];
    NSString *year  = [self currentYearName];

    //set table on the middle
    for(NSString *cellMonth in self.months) 
    {
        if([cellMonth isEqualToString:month]) 
        {
            row = [self.months indexOfObject:cellMonth];
            row = row + [self bigRowMonthCount] / 2;
            break;
        }
    }

    for(NSString *cellYear in self.years) 
    {
        if([cellYear isEqualToString:year]) 
        {
            section = [self.years indexOfObject:cellYear];
            section = section + [self bigRowYearCount] / 2;
            break;
        }
    }

    return [NSIndexPath indexPathForRow:row inSection:section];
}

-(NSString *)currentMonthName
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"MMMM"];
    return [formatter stringFromDate:[NSDate date]];
}

-(NSString *)currentYearName
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy"];
    return [formatter stringFromDate:[NSDate date]];
}

@end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UIDatePicker 选择月份和年份 的相关文章

  • 为什么 GDB 调试器不断冻结 Xcode 4?

    这真是一个奇怪的错误 我正在开发一个使用相机源的 iPhone 项目 并通过 OpenGL 着色器运行它以对其应用效果 然而 每次我在代码中简单地创建一个新的 GLfloat 时 调试器都会在启动时冻结 我无法复制和粘贴文本 因为整个 XC
  • Swift 中 UIImages 的淡入淡出动画

    我有一组图像 我希望它们在登录屏幕的背景中淡出 我无法在 swift 中找到任何可以做到这一点的东西 有什么办法我可以做到吗 这是我当前的代码 override func viewDidLoad super viewDidLoad star
  • 播放(非库)Apple Music 内容 - 请求失败

    我正在尝试使用以下代码播放专辑 let predicate MPMediaPropertyPredicate value 1459938538 forProperty MPMediaItemPropertyAlbumPersistentID
  • 如何自动为 Swift 类创建初始化程序?

    UPDATE 使用结构而不是类 struct 在很多方面都更好 它有自己的初始化器 这是我的模型课 是否有可能创建init自动方法 每次我都必须将所有变量一一初始化 这会花费很多时间 class Profile var id String
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • Xcode MyProjectName-Bridging-Header.h 不存在

    我想开始在我的 Objective C 项目中使用 Swift 所以我添加了一个快速类 import Foundation objc class System NSObject objc func printSome println Pri
  • 应用程序发布后,对如何更新 UITableView 上的数据源感到困惑

    阅读文档后 我似乎误解了有关数据管理的一些概念 所以我试图澄清一些方面 如果这篇文章听起来多余和重复 请道歉 我的应用程序有多个 TableView 每个表视图都有一个 pList 形式的数据源 因此 我有几个属性列表用作我的表的数据源 目
  • 我无法捕获 WKWebView 的屏幕截图

    我正在尝试捕获 WKWebView 的屏幕截图 但我的方法无法正常工作 它返回纯色 就好像图层树为空一样 而它似乎适用于其他视图 UIImage screenshot UIImage screenshot UIGraphicsBeginIm
  • 多个 ViewController(containerView?childView?viewController 的实例?)

    我需要在另一个视图之上添加一个新视图 带有 ViewController 用户与这个新视图交互了一段时间 然后我想将其删除 在旧版本的 Xcode 中 我可以将其添加为子视图 我现在收到 EXC BAD ACCESS 错误 我不希望添加的视
  • 在 iOS 上的 SceneKit 中导入 3d 模型

    从 URL 导入 obj 文件并将其转换为 SCNNode 时遇到问题 这是代码 swift3 let url URL init string https cloud box com shared static ock9d81kakj91d
  • Xcode 9.0.1 应用程序分发程序已更改

    最近我将 Xcode 升级到了 Xcode 9 1 之后 当我尝试发布我的应用程序时 Xcode 不允许选择我为临时创建的分发配置文件 这么说 配置文件不是 IOS 应用商店配置文件 如果 Xcode 9 1 的应用程序分发过程有变化 请告
  • 检测 UITableView 中的水平平移

    我正在使用 UIPanGestureRecognizer 来识别 UITableView 中的水平滑动 准确地说是在单元格上 尽管它已添加到表格本身 然而 这个手势识别器显然窃取了桌子上的触摸 我已经让 pangesturerecogniz
  • 是否可以使用 iOS SDK 更改 Amazon Cognito 中的用户名?

    正如标题中所写 是否可以更改 Amazon Cognito 用户的用户名 我在文档中找不到任何内容 可以更新preferred username使用 iOS SDK 的 Cognito 用户 使用updateAttributesAPI 调用
  • NSPredicate 使用 RLMResults 作为参数

    我试图通过使用 NSPredicate 进行过滤来获取两组 Realm 数据 并且是不同的对象 之间的差异 但存在一个我无法理解的错误 我的代码 RLMResults topStories KFXTopStory allObjects NS
  • 如何相对于包含视图大小定位子视图?

    我希望能够将我的子视图从顶部定位到超级视图大小的 25 NSLayoutConstraint topPositionConstraint NSLayoutConstraint constraintWithItem containerView
  • ios - 使用 SIGPIPE 和 SIG_IGN 的信号函数

    我加入了一个旧项目 我发现了这条线 BOOL application UIApplication application didFinishLaunchingWithOptions NSDictionary launchOptions si
  • 如何确定 UINavigationController 中工具栏的高度?

    我有一个带有由 UINavigationController 呈现的工具栏的视图 当我处理 UIKeyboardWillShowNotification 时 我将整个屏幕向上滚动键盘的高度 问题是当显示键盘时 底部工具栏不显示 所以我只需将
  • swift 3.0 中的 Sha 256 加密语法错误

    func SHA256 gt String let data self data using String Encoding utf8 let res NSMutableData length Int CC SHA256 DIGEST LE
  • 后台模式下的 AVSpeechSynthesizer

    我无法获取 iOS 7AVSpeechSynthesizer当我的 iOS 应用程序处于后台模式时工作 我添加了 应用程序播放音频 应用程序支持的后台模式的关键 但我仍然无法让它工作 我还研究了创建一个AVMutableCompositio
  • iOS SWIFT - WebRTC 从前置摄像头更改为后置摄像头

    WebRTC 视频默认使用前置摄像头 效果很好 但是 我需要将其切换到后置摄像头 但我无法找到任何代码来执行此操作 我需要编辑哪一部分 是 localView 或 localVideoTrack 还是捕获器 斯威夫特3 0 对等连接只能有一

随机推荐

  • 共享模式下的 Excel 下拉菜单

    当我将 Excel 工作簿更改为共享模式并尝试复制并粘贴具有下拉列表 数据验证列表 的行时 下拉列表消失 只要工作簿不共享 它就可以正常工作 有什么解决办法吗 将工作簿设置为取消共享 复制粘贴您的数据 然后再次共享工作簿 共享工作簿有用的
  • 高可用性计算:如何处理不返回的系统调用,而不冒误报的风险?

    我有一个进程在 Linux 计算机上运行 作为高可用性系统的一部分 该进程有一个主线程 用于接收来自网络上其他计算机的请求并响应它们 还有一个心跳线程定期发送多播心跳数据包 让网络上的其他进程知道该进程仍然存在并且可用 如果它们在一段时间内
  • 如何在代码中更改操作栏标题颜色

    我在以编程方式更改 v11 及更高版本的 Android 操作栏标题颜色时遇到问题 我可以在 xml 中完成它 但需要在代码中动态更改它 我该怎么办 提前致谢 您可以使用 SpannableString 和 ForegroundColorS
  • 计算将 Box2D 主体移动到特定位置的正确冲击力或力 - Box2D

    我有一个关于将 Box2D 主体移动到特定位置而不使用此示例的问题 body gt SetTransform targetVector body gt GetAngle 我有一些适用于 applyForce 的代码 here const f
  • Scala中的apply方法是什么,特别是在类型定义中使用

    我知道apply方法在伴生对象中使用时是语法糖 然而 什么是apply方法在类型定义中使用时如下所示 type Applyn def apply A f A gt A n Int x A A 这句话之间有区别吗 据我猜测 这句话是用于将通用
  • sourceupdated 事件未触发

    我发现了主机 这是ObservableCollection
  • 如何在 Flutter 中处理不同屏幕尺寸上的定位元素(在 Stack 中)?

    以下是包含堆栈和其中一些定位小部件的代码 Stack children Positioned top 50 bottom 0 left 30 child Text Mon Sat style TextStyle color Colors w
  • BUG:Java Swing 键绑定在 OSX 中使用 awt setFullScreenWindow 时 JDK 7 失去功能

    编辑 1 16 2013 原始问题已被删除 这似乎是 mac OSX 上 JDK 7 的一个错误 我已向 Sun Oracle 提交了错误报告 下面的文件使用 awt 类 GraphicsEnvironment 和方法 setFullScr
  • 禁用鼠标垂直滚动[重复]

    这个问题在这里已经有答案了 可能的重复 如何通过鼠标停止垂直滚动 我在网络浏览器中使用 javascript Jquery 我制作了一个自定义水平滚动条 它与鼠标滚轮或鼠标滚动一起使用 通常鼠标滚动与垂直条配合使用 所以它和我编程的水平滚动
  • 创建子文档后如何填充猫鼬?

    我正在向 item comments 列表添加评论 在将其输出到响应中之前 我需要获取 comment created by 用户数据 我该怎么做 Item findById req param itemid function err it
  • 嵌套 XML 到 Pandas 数据框

    我正在尝试创建一个脚本来将嵌套 XML 文件转换为 Pandas 数据帧 我找到了这篇文章https medium com robertopreste from xml to pandas dataframes 9292980b1c1c 它
  • 在子域中部署 laravel 4 应用程序

    我即将在共享网络主机上将 laravel 4 部署到子域中 但我对该怎么做有点困惑 我在 hostpapa 帐户上运行它 但对配置不满意并切换了测试环境的提供商 我创建了以下文件夹 域 私人 myApps golfmanager 我已将除公
  • Android 如何支持阿拉伯文字?

    我成功从服务器获取阿拉伯文本 我想在代码中显示检索到的文本 但它显示框而不是阿拉伯文本 假使 假设t数组值是来自服务器的阿拉伯文本 string t Textview tv Textview findviewByid R id text t
  • 显示数据的可扩展 UITableView 单元格

    我有一些按年份编录的体育比赛 对于每场比赛 我都有最终结果 比赛日期和得分手 我在 表格视图 中显示这些匹配项 如下所示 所以我想要实现的是 当单击单元格时 显示比赛详细信息 如图所示 我还找到了一些库来实现手风琴 可扩展风格 但没有人能完
  • python selenium无法清除输入字段

    我尝试使用 selenium 选择我的输入 但是当我使用它时它不起作用 driver self driver password driver find element by xpath input name password passwor
  • 从远程系统提交 MapReduce 作业时出现异常

    我从远程系统提交 MapReduce 作业时遇到异常 13 10 28 18 49 52 错误 security UserGroupInformation PriviledgedActionException 为 根本原因 org apac
  • iPhone“全字”搜索

    我目前正在使用以下算法在我的 iPhone 应用程序上进行搜索 NSRange range entry englishEntry rangeOfString searchText options NSCaseInsensitiveSearc
  • 如何从 Stack Exchange API 获取给定用户名的用户 ID?

    我想使用以下方法获取 Stack Overflow 上的用户活动 users ids timeline method 问题是这个方法只接受一个用户 ID 但我想传递一个用户名 所以任何人都可以写下他们的昵称并获取相关的统计数据 该 API
  • 如何用css画一条线并在其上显示文本或图像

    我正在尝试使用 CSS 画一条线并在线中间显示文本 图像 featured images color 666666 border 2px solid 333333 p class featured images Featured p 这就是
  • UIDatePicker 选择月份和年份

    我需要一个UIDatePicker仅用于选择月份和年份 我检查了课程参考文档 好像UIDatePicker is a UIView 我想象UIPickerView可能是一个子视图 如果我能抓住它 我可以隐藏该组件 但不是 那是不可能的 那么