Ios 目标C:从NSObject类返回根目录

Ios 目标C:从NSObject类返回根目录,ios,objective-c,uiviewcontroller,segue,Ios,Objective C,Uiviewcontroller,Segue,我制作了一个应用程序,它是我们公司产品的延伸。用户使用与我们产品相同的用户名和密码登录(服务器端处理) 本质上,作为用户,您可以在应用程序中键入“stuff”,然后将其发送到服务器。每次对服务器的调用都会检查用户名和密码是否正确。(存储在核心数据和钥匙链中) 但是,如果我们得到无效密码作为响应(例如,如果他们的上级更改了他们的密码),则应将该用户从应用程序中删除(我已经为此编写了代码)并转到root视图 如果我理解正确,在应用程序中的任何位置,网络请求可能会返回身份验证错误,在这种情况下,您希望

我制作了一个应用程序,它是我们公司产品的延伸。用户使用与我们产品相同的用户名和密码登录(服务器端处理)

本质上,作为用户,您可以在应用程序中键入“stuff”,然后将其发送到服务器。每次对服务器的调用都会检查用户名和密码是否正确。(存储在核心数据和钥匙链中)


但是,如果我们得到无效密码作为响应(例如,如果他们的上级更改了他们的密码),则应将该用户从应用程序中删除(我已经为此编写了代码)并转到root视图 如果我理解正确,在应用程序中的任何位置,网络请求可能会返回身份验证错误,在这种情况下,您希望显示rootViewController


您不希望以您描述的方式将下载程序直接链接到ViewController。下载程序希望(通过NSNotification、delegate、KVO等)发出信号,表明发生了身份验证错误,用户不再被授权。然后,控制viewController层次结构的对象可以重新组织viewController层次结构。您的VIEW控制器现在看起来足够简单,能够在AppDebug中实现这一点,但是如果您希望您的应用程序在即将到来的蒙太奇中增长,您应该考虑创建一个专用的对象,该对象负责确保正确的VC层次结构的建立。

< P>如果您在应用程序的任何地方,我都能正确理解,网络请求可能会返回身份验证错误,在这种情况下,您希望显示rootViewController


您不希望以您描述的方式将下载程序直接链接到ViewController。下载程序希望(通过NSNotification、delegate、KVO等)发出信号,表明发生了身份验证错误,用户不再被授权。然后,控制viewController层次结构的对象可以重新组织viewController层次结构。您的viewController现在看起来足够简单,可以在appDelegate中实现这一点,但是如果您希望您的应用程序在接下来的一个月内增长,您应该考虑创建一个专用的对象,它负责确定正确的VC层次结构。

您需要一种通知ViepController的方法,它应该弹出到导航控制器的根视图控制器。 现在,由于每个请求还包括用户的用户名和密码,因此在任何请求中都可能出现您希望通知此情况的情况

我的建议是使用,一个类,它允许您向应用程序中侦听消息的任何人广播消息

例如,我们将此通知称为“XYZLogOut”

在您的viewController的
-viewWillDisplay
方法中,将其注册为此通知的观察者:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(shouldLogOut) name:@"XYZLogOut" object:nil];
确保在
-视图将消失:
方法中移除作为观察者的viewController:

[[NSNotificationCenter defaultCenter] removeObserver:self];
请注意,您需要创建一个具有相同选择器名称的方法,在广播该通知时将调用该方法

-(void)shouldLogOut
{
    [self.navigationController popToRootViewControllerAnimated:YES];
}
最后,在XYZUploader类中,您应该在需要注销时调用此通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"XYZLogOut" object:nil userInfo:nil];

您需要一种方法来通知viewController它应该弹出到其导航控制器的根视图控制器

现在,由于每个请求还包括用户的用户名和密码,因此在任何请求中都可能出现您希望通知此情况的情况

我的建议是使用,一个类,它允许您向应用程序中侦听消息的任何人广播消息

例如,我们将此通知称为“XYZLogOut”

在您的viewController的
-viewWillDisplay
方法中,将其注册为此通知的观察者:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(shouldLogOut) name:@"XYZLogOut" object:nil];
确保在
-视图将消失:
方法中移除作为观察者的viewController:

[[NSNotificationCenter defaultCenter] removeObserver:self];
请注意,您需要创建一个具有相同选择器名称的方法,在广播该通知时将调用该方法

-(void)shouldLogOut
{
    [self.navigationController popToRootViewControllerAnimated:YES];
}
最后,在XYZUploader类中,您应该在需要注销时调用此通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"XYZLogOut" object:nil userInfo:nil];

在rootviewcontrller中注册通知,注销方法应处理rootviewcontrller的转换

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(logout)
                                             name:@"InvalidCredentialsNotification"
                                           object:nil];
在XYZUploader.m post通知中

dispatch_async(dispatch_get_main_queue(), ^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"InvalidCredentialsNotification" object:nil];
});

在rootviewcontrller中注册通知,注销方法应处理rootviewcontrller的转换

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(logout)
                                             name:@"InvalidCredentialsNotification"
                                           object:nil];
在XYZUploader.m post通知中

dispatch_async(dispatch_get_main_queue(), ^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"InvalidCredentialsNotification" object:nil];
});

好的,如果我理解正确,我应该创建一个带有NSNotificationCenter子类的类XYZLogOut,该子类包含shouldLogOut函数,并在我的XYZiPad_登录类中添加ViewWillExisten和ViewWillEnglishe代码?好的,如果我理解正确,我应该创建一个带有NSNotificationCenter子类的类XYZLogOut,该子类包含应该在我的XYZiPad_登录类中添加ViewWillDisplay和ViewWillEnglishe代码吗?嘿,这很好用。我在我的XYZiPad_登录中获得了回调注销函数。但是我如何让它回归自我(如果这有意义的话)你说的回归自我是什么意思?我对您的问题的理解是,在显示登录屏幕后,输入正确的凭据并点击登录按钮,它应该在注销前转到现有视图。这是你的问题吗?请解释一下?简单地说:当我在XYZUploader.m内调用InvalidCredentialsNotification时,我希望根vc显示出来。通过一些拨弄,我使它工作了!我不得不打电话给[自我解除视图控制员激活:是完成:无];内部注销方法调用[self.navigationController PoptorootViewController初始化:是],它将从任何视图显示roortviewcontroller嘿,这很好用。我在我的XYZiPad_登录中获得了回调注销函数。但是我如何让它回归自我(如果这有意义的话)你说的回归自我是什么意思?我对您的问题的理解是,在显示登录屏幕后,输入正确的凭据并点击登录按钮,它应在登录之前转到现有视图