将数字 0 - 59 添加到 NSMutableArray 以显示在 pickerView 中
Add numbers 0 - 59 to a NSMutableArray to display in a pickerView
我有一个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
return NSString
方法。现在你正在 returning NSNumber。并且编译器不会警告你,因为 NSArray 可以包含任何对象,它只是不知道这个是 NSNumbers 数组而不是 NSStrings。
您可能想将带有数字的 NSString 添加到 timing
,例如 [timing addObject:[NSString stringWithFormat:@"%d", i]];
此外,您似乎根本不需要 timing
数组 — 现在您正在为每一行创建它并仅使用其中的一个元素。你可以 return 字符串 row
直接像这样
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return [NSString stringWithFormat:@"%d", row];
}
你的方法应该return一个NSString *
,但是你return一个NSNumber *
你应该这样写:
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [NSString stringWithFormat:@"%d", row];
}
无需每次调用都构建数组。
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
此方法应该 return 一个 NSString
,但您 return 从 timing
数组中获取一个对象,您刚刚用 NSNumber
对象。 __NSCFNumber
是 NSNumber
的私有子类。选择器视图中的某些内容假定您 returned 的对象是 NSString
,并要求其 length
.
解决办法是return一个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) 以确保它们的格式正确,适合用户的区域设置。
我有一个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
return NSString
方法。现在你正在 returning NSNumber。并且编译器不会警告你,因为 NSArray 可以包含任何对象,它只是不知道这个是 NSNumbers 数组而不是 NSStrings。
您可能想将带有数字的 NSString 添加到 timing
,例如 [timing addObject:[NSString stringWithFormat:@"%d", i]];
此外,您似乎根本不需要 timing
数组 — 现在您正在为每一行创建它并仅使用其中的一个元素。你可以 return 字符串 row
直接像这样
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return [NSString stringWithFormat:@"%d", row];
}
你的方法应该return一个NSString *
,但是你return一个NSNumber *
你应该这样写:
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [NSString stringWithFormat:@"%d", row];
}
无需每次调用都构建数组。
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
此方法应该 return 一个 NSString
,但您 return 从 timing
数组中获取一个对象,您刚刚用 NSNumber
对象。 __NSCFNumber
是 NSNumber
的私有子类。选择器视图中的某些内容假定您 returned 的对象是 NSString
,并要求其 length
.
解决办法是return一个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) 以确保它们的格式正确,适合用户的区域设置。