[NSCFNumber isEqualToString:]: нераспознанный селектор, отправленный экземпляру - PullRequest
27 голосов
/ 29 июля 2011

Хорошо, у меня следующая общая проблема

[NSCFNumber isEqualToString:]: unrecognized selector sent to instance

но на этот раз я не уверен, как это исправить.

Вот декларация в viewDidLoad:

- (void)viewDidLoad {

    [super viewDidLoad];

    NSMutableArray *tempHours = [NSMutableArray array];
    for (int i = 0; i < 12; i++) { 
        [tempHours addObject:[NSNumber numberWithInt:(i+1)]];
    }
    self.hours = tempHours; // 'hours' is a synthesized NSArray property of the ViewController
    [tempHours release];

  // two more similar array declarations here

}

Вот метод кода UIPickerView, где вещи ломаются (например, оператор if)

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

    NSString *stringIndex = [NSString stringWithFormat:@"Row #%d", row];

    if(component == 0) {
        return stringIndex = [self.hours objectAtIndex:row];
    }

    // more code for other components (of the same form) here

    return stringIndex;
}

Я думаю, мне нужно, чтобы мой NSArray объектов NSNumber был приведен к типу как строки. Как мне сделать это правильно с этим утверждением:

stringIndex = [self.hours objectAtIndex:row];

Спасибо!

Ответы [ 4 ]

45 голосов
/ 29 июля 2011
return [NSString stringWithFormat:@"%@",[self.hours objectAtIndex:row]];
8 голосов
/ 29 июля 2011

Вы возвращаете NSNumber, поскольку это то, что содержится в self.hours.Поскольку NSString является ожидаемым возвращаемым значением, вы должны создать строку с помощью:

[NSString stringWithFormat:@"%@", [self.hours objectAtIndex:row]];

или пересмотреть свое намерение.Вы действительно хотели хранить индексы таким образом, или вы хотели сохранить NSStrings?

3 голосов
/ 19 декабря 2012

Если у кого-то возникла эта проблема и он специально возвращает индекс строки, вы всегда можете преобразовать NSNumber в stringValue, выполнив следующее:

NSString *code = [[[JSONResponse objectForKey:@"meta"] objectForKey:@"code"] stringValue];

Помещение stringValue в концеметода будет преобразовывать что-либо в строку, вы также можете использовать intValue.

2 голосов
/ 29 июля 2011

Комментарий [tempHours release]; // это объект с автоматическим освобождением. Вы не использовали и с alloc или copy или new:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSMutableArray *tempHours = [NSMutableArray array];

    for (int i = 0; i < 12; i++) { 
        [tempHours addObject:[NSNumber numberWithInt:(i+1)]];
    }

    self.hours = tempHours; // 'hours' is a synthesized NSArray property of the ViewController

    // [tempHours release];
}

больше, чем вы добавили NSNumber в массив так преобразовать в строковое значение:

stringIndex =[NSString stringWithFormat:@"%@",[self.hours objectAtIndex:row]];
...