我正在尝试开发一个允许用户使用AFNetworking登录的应用程序。我正确设置了数据库,除非用户首次登录,否则一切似乎都正常。
我所拥有的是非常简单的:
[[API sharedInstance] commandWithParams:params
onCompletion:^(NSDictionary *json) {
//result returned
NSDictionary* res = [[json objectForKey:@"result"] objectAtIndex:0];
if ([json objectForKey:@"error"]==nil && [[res objectForKey:@"UserID"] intValue]>0) {
[[API sharedInstance] setUser: res];
[self performSegueWithIdentifier:@"Login" sender:self];
} else {
//error
[UIAlertView title:@"Error" withMessage:[json objectForKey:@"error"]];
}
}];
基本上,上面的代码返回用户登录详细信息的结果,仅在登录详细信息匹配时才成功。如您所见,我清楚地将用户设置在整个应用程序中使用的sharedInstance中。设置用户后,我尝试执行segue,这就是登录按钮应该做的事情。
segue确实发生了,程序正在运行,但有两个问题我无法解决,而且我花了好几个小时试图修复它。首先,我在Xcode的输出窗口中收到消息:
警告:在a时尝试在LoginVC上显示UITabBarController 演讲正在进行中!
其次,为了测试用户设置是否正确,在“配置文件”屏幕上(第一个屏幕被隐藏)有一个标签,其文本设置为:
NSString stringWithFormat:@"Welcome %@",[[[API sharedInstance] user] objectForKey:@"username"]];
如果用户名实际出现或显示(null),这是一个命中或未命中,如下所示:
您还可以看到我在那里制作的按钮,在输出窗口中打印用户的值。即使消息是“欢迎(null)”并按下按钮,所有值都正确,所以我不确定为什么字符串有时会为null。
这是关于我遇到的问题的故事板设置:
如果有人能帮助我,我真的很感激。
答案 0 :(得分:9)
正确诊断后,问题肯定是对segue的一些奇怪的和/或重复的调用。查看您的项目,问题是您的“登录”按钮同时具有IBAction
方法以及从该登录屏幕到下一个控制器(标签栏控制器)的segue:
这是一个问题,因为当您点击按钮时会触发segue,但会被- (IBAction)login:(id)sender
代码再次触发。
因为你有一个IBAction
,所以segue应该不从按钮到下一个控制器,而是来自控制器本身。因此,将现有的Login
segue从按钮删除到下一个屏幕,然后从控制器本身重新创建它:
将新的segue作为“登录”标识符,现在您的“登录”按钮不会自动执行segue本身,但会让IBAction
完成其工作,并根据需要手动performSegueWithIdentifier
。
答案 1 :(得分:0)
发送/触发事件:Did End On Exit
将其连接到调用performSegueWithIdentifier
的方法。
这样它不会触发两次。