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

时间:2015-02-23 02:54:19

标签: ios objective-c for-loop uipickerview

我有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 个答案:

答案 0 :(得分:2)

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

您可能希望将带有数字的NSS字符串添加到timing,如[timing addObject:[NSString stringWithFormat:@"%d", i]];

看起来你根本不需要timing数组 - 现在你正在为每一行创建它并且只使用它中的一个元素。您可以直接返回编号为row的字符串

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

答案 1 :(得分:2)

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component

这个方法应该返回一个NSString,但是你要从timing数组中返回一个对象,你刚刚填充了NSNumber个对象。 __NSCFNumberNSNumber的私有子类。选择器视图中的某些内容假设您返回的对象是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)];
}

额外奖金

由于您的号码将面向用户,因此您应该使用NSNumberFormatterlink to tutorial)来确保它们是针对用户的语言环境正确格式化的。

答案 2 :(得分:1)

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

你应该这样写:

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

每次调用时都不需要构建数组。