Почему это не сохранить? - PullRequest
0 голосов
/ 19 ноября 2011
NSString *senderName = [sender currentTitle];
NSLog(@"Text to be Saved = %@",senderName);
[name setObject:senderName forKey:@"key"];
NSString *TextActuallySaved = [name stringForKey:@"key"];
NSLog(@"Text actually Saved = %@", TextActuallySaved);

Итак, у меня есть этот код, и когда я его запускаю, я получаю его в консоли:

appName[19556:f803] Text to be Saved = SCV
appName[19556:f803] Text actually Saved = (null)

Итак, что я сделал не так?Я объявил объект NSUserDefault в заголовке @interface следующим образом:

@interface viewController : UIViewController  {
NSUserDefaults *name;
}

Весь этот код находится в ViewController, так как он выдвигается.Так вот почему?Если так, есть ли способ обойти это?Это серьезно беспокоит меня.Любая помощь приветствуется.СПАСИБО!

Вот мой код инициализации

- (id)init {
if (self = [super init])
{
    name = [NSUserDefaults standardUserDefaults];
}
return self;
}

Ответы [ 2 ]

1 голос
/ 19 ноября 2011

Вы на самом деле устанавливали этот ivar в объект по умолчанию?

name = [NSUserDefaults standardUserDefaults];

Обычно вы делаете это в вашем методе init.


Я предполагаю это, потому что в ObjectiveC nilна него могут быть вызваны методы, все из которых возвращает ноль.Так что, если name равно nil, то оно молча не сможет сохранить, а затем вызовите return nil при попытке прочитать его обратно.

0 голосов
/ 20 ноября 2011

В отличие от большинства Объектов, указанный инициализатор для UIViewController не init.Теперь я вижу, что вы сказали, что это ViewController, извините, я пропустил его раньше.Назначенный инициализатор для UIViewController является либо initWithCoder, либо initWithFrame, один из которых будет вызван для инициализации.Это приводит к проблемам, «где я могу разместить свой установочный код», это уже обсуждалось на SO ранее.

На самом деле я бы поспорил, что если вы введете NSLog(@"Init"); в свой метод init, то вы 'Я вижу, это никогда не называется.Поэтому он никогда не может назначить ваш ivar.

Для простоты, если вы создаете подкласс UIViewController и хотите выполнить инициализацию, которая НЕ ДОЛЖНА быть в методе init, который вы используете viewDidLoad.

- (void)viewDidLoad{
    [super viewDidLoad];
    name = [NSUserDefaults standardUserDefaults];
    // Do any additional setup after loading the view, typically from a nib.
}
...