有没有办法在 iOS 中获取分钟和小时的集合/数组?
Posted
技术标签:
【中文标题】有没有办法在 iOS 中获取分钟和小时的集合/数组?【英文标题】:Is there a way to get a Set/Array of minutes and hours in iOS? 【发布时间】:2015-01-19 14:18:30 【问题描述】:我正在尝试以最简单的方式用分钟和小时填充我的选择器视图。我正在实现一个自定义选择器,因此使用 UIDatePicker
并将其模式设置为 UIDatePickerModeTime
是不可能的。
ios 中是否有可用的函数来检索数据集,或者我只需要使用来自0-12
(12 小时制)和0-60
的硬编码值来初始化数组,分别表示小时和分钟,比如 for循环?
我目前正在像这样填充数组:
#pragma mark - Lazy Loading
-(NSArray *)hourValues
if(!_hourValues)
NSMutableArray *hours = [[NSMutableArray alloc] init];
for(int i = 0; i < 12; i++)
[hours addObject:[NSNumber numberWithInt:i]];
_hourValues = hours;
return _hourValues;
-(NSArray *)minuteValues
if(!_minuteValues)
NSMutableArray *minutes = [[NSMutableArray alloc] init];
for(int i = 0; i < 60; i++)
[minutes addObject:[NSNumber numberWithInt:i]];
_minuteValues = minutes;
return _minuteValues;
-(NSArray *)amPmValues
if(!_amPmValues)
_amPmValues = @[@"am", @"pm"];
return _amPmValues;
我不喜欢硬编码的值。
理想情况下,我希望能够做这样的事情:
hours = [NSDate NS12HourSetArray];
minutes = [NSDate NS60MinuteArray];
【问题讨论】:
也许有NSDateComponents/NSCalendar
和maximumRangeOfUnit:
,但它仍然会给你60/等。
@Larme 嘿,感谢您的评论。那怎么办呢?
注意:您应该从 1-12 或 0-11 初始化;同样是 0-59 或 1-60。初始化 0-12 和 0-60 会给你太多的分钟和小时。 ;)
反注:这取决于您如何使用比较运算符。 ;) @IanMacDonald
【参考方案1】:
我认为你有 3 个选择:
编写脚本/自动创建文本数据并在运行时加载,您可以在 python/bash 和 plist 中轻松完成。
使用旧的 for 循环手动执行。我建议这样做。
或者您可以分别使用NSIndexSet
和NSRange
对象从您想要的任何范围创建索引集。
例如:
NSIndexSet *minutesIndexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 60)];
然后,您可以直接从索引集加载 UI,或者再次枚举索引集并用其索引填充数组。
在这两种方式中,您最终要做的是通过循环迭代手动填充您的数组。唯一只做负载的是第一个。
【讨论】:
我明白了,所以没有现成的NSDate/NSDateComponents/NSCalendar
函数可以像[NSCharacterSet alphanumericCharacterSet]
那样为此目的设置一个集合?
我不知道有任何这样的 API,而且我看不出苹果提供的理由,因为大多数数据对象依赖于计算而不是数据集。
就像苹果提供的数据集一样:developer.apple.com/library/mac/documentation/Cocoa/Reference/… 我认为可能有一种方法可以检索date
数据集
字符串和字符在数学上不相关,因此拥有数据集是有意义的,日期在数学上彼此相关,因此拥有它们的集合充其量是懒惰的编程,并且很可能是一种不好的做法。
啊,我明白你所说的数学相关是什么意思。为什么是懒惰的编程?我原以为这更像是一种方便的方法。到目前为止,我一直在遵循第二种方法。谢谢你的意见,我想我会按照另一张海报的建议走类别课程路线,让事情看起来更整洁,更隐蔽。【参考方案2】:
没有可以像这样调用的内置方法。就个人而言,我并没有真正看到硬编码诸如“一小时内的分钟数”之类的问题,因为它定义明确,您可以相对确定它永远不会改变。如果您希望 API 存在,您可以通过在 NSDate
上创建一个类别来稍微隐藏它。
@interface NSDate (ConvenientArrays)
+ (NSArray *)minutesInAnHourArray;
+ (NSArray *)hourRepresentationsPerDay:(BOOL)use24Hour;
@end
@implementation NSDate (ConvenientArrays)
+ (NSArray *)minutesInAnHourArray
return @[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57, 58, 59];
+ (NSArray *)hourRepresentationsPerDay:(BOOL)use24Hour
if (use24Hour)
return @[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23];
return @[ 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12];
@end
【讨论】:
到目前为止,我一直在用 for 循环对其进行硬编码。你是对的,它们定义明确。与类别方法有很好的接触,这种方法让我没有想到,而且肯定会让事情变得更整洁。为了整洁,我将创建一个类别。出于好奇,如果不在NSDate
类中,您将在哪个类中存在 API。 NSCalender
、NSDateComponents
或者在其他班级?
这取决于您的使用情况。如果您将其用于向人类展示,您可以考虑将其放入NSDateFormatter
。我以这种方式写了hourRepresentationsPerDay:
,以便它返回0-23
24 小时和1-12
12 小时显示。不过,这取决于你。把它放在对你有意义的地方。以上是关于有没有办法在 iOS 中获取分钟和小时的集合/数组?的主要内容,如果未能解决你的问题,请参考以下文章