代码之家  ›  专栏  ›  技术社区  ›  user4487951

将数字0-59添加到NSMutableArray以在pickerView中显示

  •  0
  • user4487951  · 技术社区  · 11 年前

    我有一个 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...] )然后它就起作用了。

    3 回复  |  直到 11 年前
        1
  •  2
  •   Zev Eisenberg    11 年前
    - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
    

    此方法应返回 NSString ,但您正在从 timing 数组,您刚刚填充了 NSNumber 物体。 __NSCFNumber 是的私有子类 数字对象 。选择器视图中的某些内容假设您返回的对象是 NSString字符串 ,并要求其 length .

    解决方案是返回 NSString字符串 。最简单的方法是:

    return [NSString stringWithFormat:@"%@", timing[row]];
    

    奖金

    您的代码在算法上很慢,因为它必须运行一个循环来创建 定时 数组。如果你的代码实际上应该做它在样本中所做的事情(即,如果你没有为这个问题简化它),那么你可以这样做:

    - (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 )以确保它们对于用户区域设置是正确的格式化程序。

        2
  •  2
  •   borisgolovnev    11 年前

    您必须从 -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 方法现在您正在返回NSNumber。编译器不会警告您,因为NSArray可以包含任何对象,它只是不知道这是NSNumbers数组而不是NSString。

    您可能想将带数字的NSString添加到 timing 喜欢 [timing addObject:[NSString stringWithFormat:@"%d", i]];

    而且看起来你不需要 定时 现在,您正在为每一行创建一个数组,并且只使用其中的一个元素。您可以返回带数字的字符串 row 直接喜欢这样

    - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
    {
        return [NSString stringWithFormat:@"%d", row];
    }
    
        3
  •  1
  •   Antzi    11 年前

    您的方法应该返回 NSString * ,但您返回 NSNumber *

    你应该这样写:

     - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
      return [NSString stringWithFormat:@"%d", row];
    }
    

    无需在每次调用时构建阵列。