我的UINavigationController有问题。它涉及客户端或服务器端注销。
服务器端注销的想法就是这样,每隔15秒调用一个函数来检查App是否仍然登录。如果不是这样,那么跳转到LoginViewController。
Logout也可以从App本身发生。它执行类似的代码。
有三个相关的控制器,LoginViewController是我们想要结束的地方,SignOutController是'注销'按钮所在的位置和MainViewController。
以下是相关的代码部分。
首先,UINavigationController得到像这样的全部内容:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
splashScreenViewController_ = [[SplashScreenViewController alloc] initWithNibName:@"SplashScreenViewController" bundle:nil];
uiNav_ = [[UINavigationController alloc] initWithRootViewController:splashScreenViewController_];
uiNav_.navigationBar.barStyle = UIBarStyleBlackTranslucent;
uiNav_.navigationBarHidden = YES;
[window_ setRootViewController:uiNav_];
[window_ makeKeyAndVisible];
return YES;
}
当按下'退出'按钮或者应用程序发现服务器强制注销时,执行此代码(相同的代码,不同的功能):
LoginViewController *loginView = [[LoginViewController alloc]initWithNibName:@"LoginViewController" bundle:nil];
[self.navigationController pushViewController:loginView animated:YES];
[loginView release];
如果它是Serverside Logout,它只是重新加载MainViewController,你每隔15秒看到MainViewController的动画滑入。它从那里进入一个循环,每15秒重新加载一次。
如果单击“注销”按钮,它将跳转到MainViewController而不是LoginViewController,并启动上面描述的相同周期。
P.S。我已检查是否有任何importend变量为nil,并且我已检查实际执行的initalisation代码。
编辑:我想我没有提到这一点。我的应用程序99%的时间都有效。偶然发生这种情况,签出按钮不起作用,我开始这个循环。通常它工作正常。
答案 0 :(得分:0)
对于新的LoginViewController在其中滑动的15秒循环,似乎您没有停下来检查应用程序是否在意识到它之后已登录。你应该有一些布尔值来存储它并取消定时器或你使用的任何东西。
当你按下注销按钮时,我不明白你说的是什么,但我认为你没有做出良好的用户界面。
我建议您通过向导航控制器添加loginViewController作为root来启动应用程序。然后在没有动画的情况下添加您想要开始的那个(例如MainViewController)。每当应用程序从服务中注销时,您都会弹出视图控制器,直到第一个视图控制器为登录控制器。
您可以使用方法popToRootViewControllerAnimated:
。
如果要保留启动画面,可以将其设置为应用程序的根视图控制器,并在加载完成后将其改为uiNavigationController。
答案 1 :(得分:0)
计时器不会因为您将视图推到另一个视图上而自动停止。它将一直存在,直到它启动的控制器被释放,这只有在它从堆栈中移除后才会发生。
此外,您不需要在每次检查后将MainViewController推入堆栈,最终会有多个实例,每个实例都在另一个上面。
另外,在没有真正了解应用程序架构的情况下,使用LoginViewController模式似乎是一个好主意,如果他们没有登录,他们真的无法做任何事情吗?模块化呈现的视图控制器不会受到导航堆栈的影响,并且还比使用手动推送/弹出控制器更容易保留用户导航堆栈。