在 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"];
}
}
}
我正在尝试在 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"];
}
}
}