我有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...]
)时,它会起作用。
答案 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
个对象。 __NSCFNumber
是NSNumber
的私有子类。选择器视图中的某些内容假设您返回的对象是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)来确保它们是针对用户的语言环境正确格式化的。
答案 2 :(得分:1)
您的方法应返回NSString *
,但您返回NSNumber *
你应该这样写:
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [NSString stringWithFormat:@"%d", row];
}
每次调用时都不需要构建数组。