我试图在AppDelegate中用NSUserDefaults存储一个值。成功地存储了它,但是当我尝试从NSUserDefaults获取相同的值时,它返回为空。我已经尝试找到解决方案,并实现了我所能得到的一切,但仍然无法找到这个空白值的正确原因。请检查代码,并帮助我解决这个问题。提前感谢!
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 ";
}发布于 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中
[[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"];
}
}
}https://stackoverflow.com/questions/47449633
复制相似问题