我已经声明了一个变量NSString sessionId;在app委托文件中进行全局使用。
在appdelegate.h
@property (strong, nonatomic) NSMutableString *sessionId;
在appdelegate.m
@synthesize sessionId;
并在我的一个视图控制器中使用它。
((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId = sID.retain;
NSLog(@"session id = %@", ((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId);
我能够在所有视图控制器中识别变量sessionId,但问题是该值未保存在其中。就像在viewcontroller1.m中一样,我为它分配了一些值但是当我在另一个viewcontroller2.m中访问sessionId时,它在控制台上显示其值为null。
如何解决此问题。
已添加代码:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *responseString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
self.receivedData = nil;
NSError *error;
SBJSON *json = [[SBJSON new] autorelease];
NSArray *session = [json objectWithString:responseString error:&error];
SBJsonParser *parser =[[SBJsonParser alloc] init];
NSDictionary *jsonObject = [parser objectWithString:responseString];
sID = [jsonObject objectForKey:@"session"];
((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId = sID;
NSLog(@"session id = %@", ((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId);
NSUserDefaults *sessID = [NSUserDefaults standardUserDefaults];
[sessID setObject:sID forKey:@"sessionID"];
[sessID synchronize];
NSLog(@"This session %@ saved", sID);
NSDictionary *accountsObj = [parser objectWithString:responseString];
NSString *accounts = [accountsObj objectForKey:@"account"];
NSArray *accountList = [accounts componentsSeparatedByString:@","];
NSLog(@"Accounts: %@", accountList);
if (session == nil)
NSLog(@"JSON parsing failed: %@", [error localizedDescription]);
else {
if (accountList.count > 1) {
ChooseAccountsController *accountsView = [[ChooseAccountsController alloc] initWithNibName:@"ChooseAccountsController" bundle:nil ];
self.chooseAcc = accountsView;
[self.view addSubview: accountsView.view];
} else if (accountList.count == 1) {
MainScreenController *mainScreen1 = [[MainScreenController alloc] initWithNibName:@"MainScreen" bundle:nil ];
self.mainScreen = mainScreen1;
[self.view addSubview: mainScreen1.view];
}
}
}
答案 0 :(得分:0)
老实说,不知道为什么这不起作用,但尝试创建一个Singleton对象来保存和访问此变量。这更优雅,应该为你的意图服务。
答案 1 :(得分:0)
((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId = sID.retain;
无效代码,请尝试
((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId = sID
一个强大的属性应该保留,并且还保留一条消息,所以如果你需要这个(不是在这种情况下),唯一正确的语法是[anObject retain]
尝试
((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId = [jsonObject objectForKey:@"session"];
答案 2 :(得分:0)
我认为该行
((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId = sID.retain;
应该阅读
((VektorAppDelegate *)[UIApplication sharedApplication].delegate).sessionId = sID;
我不知道它在没有崩溃的情况下工作......
答案 3 :(得分:0)
NSLog在viewcontroller1中的值,以确保其设置。
如果是,则很可能在viewcontroller2中,当您尝试访问时,您正在重新定义sessionid。
此外,您可能想在AppDelegate之外创建一个单例。