在 NSUserdefaults 中的 AppDelegate 中保存数据,但在其他视图控制器上检索时变为空白

Saving data in AppDelegate in NSUserdefaults but getting blank when retrieved on other view controller

我正在尝试在 NSUserDefaults 中存储一个值 AppDelegate。 它已成功存储,但是当我尝试从 NSUserDefaults 中获取相同的值时,它 returns 为空白。我已尝试找到解决方案并实施所有我能得到的解决方案,但仍然无法找到此空白值的正确原因。 请检查代码并帮助我解决此问题。提前致谢!

AppDelegate

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
     if([self.element isEqualToString:@"client_login"]){
          self.currentValue = string;
         [[NSUserDefaults standardUserDefaults] setObject:self.currentValue forKey:@"client_login"];
        //  NSLog(@"defaults value %@",[defaults valueForKey:@"client_login"]);
          //[defaults synchronize];
     }
     else{
         NSLog(@"currentValue value is blank");
     }

}

ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   // [[NSUserDefaults standardUserDefaults] valueForKey:@"client_login"];
    _loginLbl.text =[[NSUserDefaults standardUserDefaults] valueForKey:@"client_login"];

    NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);

    // Do any additional setup after loading the view, typically from a nib.
}

日志

XMLParsingDemo[3549:162060] {
    AKLastIDMSEnvironment = 0;
    AddingEmojiKeybordHandled = 1;
    AppleITunesStoreItemKinds =     (
        "itunes-u",
        movie,
        ringtone,
        album,
        "software-update",
        booklet,
        tone,
        "music-video",
        song,
        podcast,
        software,
        "podcast-episode",
        wemix,
        eBook,
        artist,
        mix,
        document
    );
    AppleKeyboards =     (
        "en_US@sw=QWERTY;hw=Automatic",
        "emoji@sw=Emoji",
        "en_US@sw=QWERTY;hw=Automatic"
    );
    AppleKeyboardsExpanded = 1;
    AppleLanguages =     (
        en
    );
    AppleLanguagesDidMigrate = 15B87;
    AppleLocale = "en_US";
    ApplePasscodeKeyboards =     (
        "en_US@sw=QWERTY;hw=Automatic",
        "emoji@sw=Emoji",
        "en_US@sw=QWERTY;hw=Automatic"
    );
    NSInterfaceStyle = macintosh;
    NSLanguages =     (
        en
    );
    PKKeychainVersionKey = 4;
    "client_login" = "\n    ";
}

此问题的可能原因是您在 -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 中获取任何值之前调用了您的 viewDidLoad() 此方法已更新。因此,您可能会在设置任何值之前访问一个值。

可能的解决方法是使用通知。在你的 appDelegate post 中,当你的 -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 被调用时发出通知,并在你的 viewcontroller 中添加一个观察者。触发通知后尝试访问该值并更新主线程上的标签。

在 appdelegate 中,将此写在您的 -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string:

[[NSNotificationCenter defaultCenter] 
        postNotificationName:@"TestNotification" 
        object:self];

在你的 viewController viewDidLoad():

[[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(receiveTestNotification:) 
        name:@"TestNotification"
        object:nil];

在viewController中只写函数:

- (void) receiveTestNotification:(NSNotification *) notification
{
    // [notification name] should always be @"TestNotification"
    // unless you use this method for observation of other notifications
    // as well.

    if ([[notification name] isEqualToString:@"TestNotification"])
        NSLog (@"Successfully received the test notification!");
}

在此方法中更新您的标签。

实际问题

问题出在:

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    NSLog(@"^^^^^^^^^ %@", _selectedElement);
    if([_selectedElement isEqualToString:@"client_login"]){
       NSLog(@"Came here: %@, %@",_selectedElement, string);
       [[NSUserDefaults standardUserDefaults]setValue:string forKey:@"login"];


    }
    else{
       [[NSUserDefaults standardUserDefaults]setValue:string forKey:@"login"];
     }
    NSLog(@"value stored in defaults is %@",[[NSUserDefaults standardUserDefaults]objectForKey:@"login"]);
}

此处 if 条件两次为真,第一次字符串变量具有正确的值,但第二次是换行的空格。

所以修改后的函数为:

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
     if([_selectedElement isEqualToString:@"client_login"]){

          NSString *trimmedString = [string stringByTrimmingCharactersInSet:
                                     [NSCharacterSet whitespaceAndNewlineCharacterSet]];
          if ([trimmedString isEqualToString:@""]){
          }else{
               [[NSUserDefaults standardUserDefaults]setValue:string forKey:@"login"];
          }

     }

}