首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在AppDelegate中将数据保存在NSUserdefaults中,但在其他视图控制器上检索时却变得空白

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

Stack Overflow用户
提问于 2017-11-23 07:17:24
回答 1查看 427关注 0票数 1

我试图在AppDelegate中用NSUserDefaults存储一个值。成功地存储了它,但是当我尝试从NSUserDefaults获取相同的值时,它返回为空。我已经尝试找到解决方案,并实现了我所能得到的一切,但仍然无法找到这个空白值的正确原因。请检查代码,并帮助我解决这个问题。提前感谢!

AppDelegate

代码语言:javascript
复制
-(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

代码语言:javascript
复制
- (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.
}

日志

代码语言:javascript
复制
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    ";
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-23 07:58:56

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

可能的解决办法可以是使用通知。在您的appDelegate中,在调用-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string时发布通知,并在视图控制器中添加一个观察者。在通知被触发后,尝试访问该值并更新主线程上的标签。

在app委托中,将其写入您的-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

代码语言:javascript
复制
[[NSNotificationCenter defaultCenter] 
        postNotificationName:@"TestNotification" 
        object:self];

在viewController viewDidLoad()中:

代码语言:javascript
复制
[[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(receiveTestNotification:) 
        name:@"TestNotification"
        object:nil];

在viewController中,只编写以下函数:

代码语言:javascript
复制
- (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!");
}

在此方法中,更新标签。

实际问题

问题在于:

代码语言:javascript
复制
-(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条件为真两次,第一次字符串变量有正确的值,第二次是带新行的空格。

因此,修改后的函数是:

代码语言:javascript
复制
-(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"];
          }

     }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47449633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档