我做了一个应用程序,它是我们公司产品的扩展。用户使用与我们产品(处理服务器端)相同的用户名和密码登录。
基本上,作为用户,您键入" stuff"进入您随后发送到服务器的应用程序。每次调用服务器都会检查用户名和密码是否正确。 (存储在core-data& keychain中)
但是,如果我们将无效密码作为回复(例如,如果他们的上级已经更改了密码),则应该从应用程序中删除用户(我已经为此编写了代码) AND segue to root view 。 < - 这就是我被困住的地方。
我有一个NSObject类XYZUploader.m来处理来自服务器的响应。 每当我们将无效密码作为响应时,我想要转到root。
XYZUploader不是上面可以找到的viewcontroller。它只是一个NSObject类来处理响应(除其他外)。这么简单:
[self.navigationController popToRootViewControllerAnimated:YES];
不起作用。我收到错误:
Property 'navigationController' not found on object of type 'XYZUploader'
我想链接(委托?)XYZUploader到XYZiPad_Login(root,上面的第一个viewcontroller)。这样我就可以调用一个函数来从当时用户碰巧打开的任何视图控制器中回到root
我该怎么做?
答案 0 :(得分:1)
如果我理解正确,在您的应用中的任何地方,网络请求可能会返回一个auth-error,在这种情况下,您想要显示rootViewController。
您不希望以您描述的方式将下载程序直接与viewControllers链接。下载程序想要(通过例如NSNotification,delegate,KVO)发出auth-error信号并且用户不再被授权。然后,控制viewController层次结构的对象可以重新组织viewController层次结构。您的viewController现在看起来很简单,可以在appDelegate中执行此操作,但如果您希望应用程序在即将到来的montsh中增长,则应考虑创建一个专用对象,负责确保设置正确的VC层次结构
答案 1 :(得分:1)
你需要一种方法来通知viewController它应该弹出它的导航控制器的根视图控制器。
现在,由于每个请求还包含用户的用户名和密码,因此在任何请求中都可能出现您想要通知此情况的情况。
我的建议是使用NSNotificationCenter
这个类,它允许您向在您的应用程序中监听它们的任何人广播消息。
例如,我们将此通知称为“XYZLogOut”。
在viewController的-viewWillAppear
方法中,将其注册为此通知的观察者:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(shouldLogOut) name:@"XYZLogOut" object:nil];
确保在-viewWillDisappear:
方法中删除viewController作为观察者:
[[NSNotificationCenter defaultCenter] removeObserver:self];
请注意,您需要创建一个具有相同选择器名称的方法,该方法将在广播该通知时调用。
-(void)shouldLogOut
{
[self.navigationController popToRootViewControllerAnimated:YES];
}
最后,在XYZUploader类中,您应该在需要注销时调用此通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"XYZLogOut" object:nil userInfo:nil];
答案 2 :(得分:0)
在rootviewcontrller中注册通知,logout方法应该处理rootviewcontrller的转换
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(logout)
name:@"InvalidCredentialsNotification"
object:nil];
在XYZUploader.m发布通知
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"InvalidCredentialsNotification" object:nil];
});