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



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

应用委托

-(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");
}
}

视图控制器

- (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 中,在调用-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string时发布通知,并在视图控制器中添加观察者。触发通知后,尝试访问该值并在主线程上更新标签。

在appdelegate中,在你的-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string中写下以下内容:

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

In your viewController viewDidLoad():

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

在视图中控制器只写函数:

- (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"];
}
}
}

最新更新