NSUserDefaults: как отображать пользовательские настройки по умолчанию, когда valueforKey является ENUM - PullRequest
3 голосов
/ 18 мая 2011

В приложении для iPhone, как отобразить значения в консоли для значений по умолчанию для пользователя, когда valueforKey является ENUM?

В настоящее время с приведенным ниже кодом, если я пытаюсь отобразить в консоли, то происходит сбой без журнала сбоев в консоли.

NSLog(@"%@",[[NSUserDefaults standardUserDefaults] valueForKey:Enum]);

Ответы [ 4 ]

5 голосов
/ 18 мая 2011

Чтобы получить:

int someValue = [[NSUserDefaults standardDefaults] integerForKey:@"your key here"];

для сохранения:

[[NSUserDefaults standardDefaults] setInteger:10 forKey:@"your key here"];

РЕДАКТИРОВАТЬ: получил, вы вылетаете, потому что в NSLog вы используете неправильный формат:

NSLog(@"%i",[[NSUserDefaults standardUserDefaults] valueForKey:Enum]);

попробуйте% i (для печати целых чисел) вместо% @ (используется для печати действительных объектов target-c)

4 голосов
/ 18 мая 2011

Поскольку enum на самом деле просто причудливый способ отображения int, все, что вам нужно сделать, это создать переменную enum и установить для нее значение, полученное из NSUserDefaults.

У вас может получиться что-то вроде:

PirateEnumType pirateType = [[NSUserDefaults standardUserDefaults] integerForKey:@"PirateType"];

РЕДАКТИРОВАТЬ:

Извините.Думаю, я не до конца понял ваш вопрос.Поскольку enum на самом деле int, вам нужно будет использовать «% i» для его отображения вместо «% @».

Чтобы правильно отобразить его как читаемую человеком строку, выпонадобится какая-то функция enumToString, например:

-(NSString*)enumToString:(PirateEnumType)enumValue {
    NSString* returnValue = @"";

    switch (enumValue) {
        case Captain:
            returnValue = @"Captain";
            break;
        case Swashbuckler:
            returnValue = @"Swashbuckler";
            break;
        case PegLeg:
            returnValue = @"PegLeg";
            break;
    }

    return returnValue;
}
0 голосов
/ 27 июля 2011

Здесь есть две проблемы.Во-первых, перечисление не может быть ключом в valueForKey.valueForKey может принимать только строки, но не строковые значения перечислений.Следовательно, вам нужно реализовать метод для получения строкового значения из перечисления.В моем примере ниже этот метод является stringFromEnum.Вот один пример того, как получить строку из перечисления .

Иногда я видел удушение NSLog, когда я прошу его напрямую включить возвращаемое значение сообщения, отправленного объекту,Я всегда обнаруживал, что сначала присваиваю результат этого сообщения переменной экземпляра, а затем передаю значение этой переменной экземпляра в NSLog, вместо этого решил проблему, но, признаюсь, я не выяснил, какие уместные факторы определяют, когда оноработает или не работает оригинальным способом.Интересуют любые комментарии.

NSString *myKey = [self stringFromEnum:Enum];
NSString *myStringToLog = [[NSUserDefaults standardUserDefaults] valueForKey:myKey];
NSLog(@"%@", myStringToLog);

Еще одно прочтение вашего вопроса может заключаться в том, что переменная вашего экземпляра Enum на самом деле является строкой, которая является ключом для перечисления, которое будет возвращено из NSUserDefaults.Однако это не может иметь место, поскольку NSUserDefaults не будет хранить перечисление.См. документацию для поддерживаемых типов объектов.Если это то, что вы пытаетесь сделать, ваша проблема может быть частично в другом коде, где вы пытаетесь сохранить перечисление в первую очередь?

0 голосов
/ 18 мая 2011

NSUserDefaults объекты на самом деле просто NSDictionary объекты.NSDictionary принимает только объект в качестве ключа.Enum - это просто целое число, поэтому вы не можете использовать его как ключ напрямую.Один из способов сделать это, однако, - использовать NSNumber, который может представлять целое число в виде объекта, подобного следующему:

[[NSUserDefaults standardDefults] valueForKey:[NSNumber numberWithInt:yourEnum];

Чтобы установить значение, вы должны сделать:

[[NSUserDefaults standardDefaults] setValue:yourValue forKey:[NSNumber numberWithInt:yourEnum]];
...