我有一个 UIPickerView
。我想要做的是显示数字 0 - 59。我尝试了以下代码:
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return 60;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
NSMutableArray *timing = [[NSMutableArray alloc] init];
for (int i = 0; i < 60; i++) {
[timing addObject:[NSNumber numberWithInt:i]];
}
return timing[row];
}
但是我得到了这个错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber length]: unrecognized selector sent to instance 0xb000000000000002'
不知道什么意思
当我尝试将字符串添加到 timing
(而不是 [NSNumber...]
)时,它会起作用。
最佳答案
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
这个方法应该返回一个 NSString
,但是你从 timing
数组中返回一个对象,你刚刚用 NSNumber
对象。 __NSCFNumber
是 NSNumber
的私有(private)子类。选择器 View 中的某些东西假设您返回的对象是一个 NSString
,并且正在询问它的 length
。
解决方案是返回一个NSString
。最简单的方法是这样的:
return [NSString stringWithFormat:@"%@", timing[row]];
奖金
您的代码在算法上很慢,因为每次调用该方法时它都必须运行一个循环来创建 timing
数组。如果您的代码实际上应该做它在您的示例中所做的事情(即,如果您没有针对问题简化它),那么您可以这样做:
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
// @(row) is equivalent to [NSNumber numberWithInteger:row]
return [NSString stringWithFormat:@"%@", @(row)];
}
额外奖励
由于您的号码将面向用户,因此您应该使用 NSNumberFormatter
( link to tutorial ) 来确保它们是针对用户区域设置的正确格式化程序。
关于ios - 将数字 0 - 59 添加到 NSMutableArray 以显示在 pickerView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28666264/