2012-03-06 2 views
1

Я пытаюсь установить сообщение об ошибке, если что-то не так, но я получаюкод падает при попытке установить локализованное описание для NSError

This class is not key value coding-compliant for the key NSLocalizedDescription 

Вот код, я использую

-(id)getMoneyFromAccount:(int) sum error:(NSError **)error 
{ 
    if(self.balance - sum < 0) 
    { 
     NSDictionary *details = [NSDictionary dictionary]; 
     [details setValue:@"You don't have enough money" forKey:NSLocalizedDescriptionKey]; 
     *error = [NSError errorWithDomain:@"money" code:200 userInfo:details]; 
     return nil; 
    } 
    self.balance = self.balance - sum; 
    return [NSNumber numberWithInt:self.balance]; 
} 

ответ

8

вы звоните setValue:forKey:, где вы должны называть setObject:forKey:

[details setObject:@"You don't have enough money" forKey:NSLocalizedDescriptionKey]; 

Кроме того, Вы должны изменить от NSDictionary к NSMutableDictionary или установить значение в инициализаторе:

NSDictionary *details = [NSDictionary 
    dictionaryWithObject:@"You don’t…" 
    forKey:NSLocalizedDescriptionKey]; 

setValue:forKey: будет работать с изменяемым словарем, но это лучше назвать setObject:forKey: напрямую.

+0

Когда я изменить код, как вы предлагаете мне получить «NSDictionary не может ответить на SetObject : forKey " – foho

+0

Да, я пропустил, что вы использовали обычный, неизменный словарь. Я отредактировал ответ, теперь код должен работать. – zoul

0

Нет, setValue: forKey: правильный способ использования. Возможно, это потому, что вам нужно создать NSMutableDictionary вместо NSDictionary.

+0

Не с NSDictionary (неизменный) – JeremyP

+0

Я не понимаю, что вы говорите? Вы всегда можете получить NSDictionary с [NSDictionary dictionaryWithDictionary: mutableDictionary]; из изменяемого словаря. – Ganzolo

+0

Он отвечает на ваше первое предложение: 'NSDictionary' не будет отвечать на' setValue: forKey: 'с ключом' NSLocalizedDescription'. – zoul

0

Для установки значения необходимо использовать NSMutableDictionary или инициализатор. NSDictionary не может быть изменен после его инициализации.

NSDictionary* details = [NSDictionary dictionaryWithObject: @"..." 
                forKey: NSLocalizedDescriptionKey]; 
1

Если вам необходимо изменить localizedDescription для NSError, которые можно инициализировать, вы можете переопределить класс NSError, как это:

@interface ValidationError : NSError 

@property (nonatomic, strong) NSString *localizedDescription; 
@end