将数字 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 对象。 __NSCFNumberNSNumber 的私有子类。选择器视图中的某些内容假定您 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) 以确保它们的格式正确,适合用户的区域设置。