2013-04-06 72 views
0

我有一个UINavigationController的问题。它关于客户端或服务器端注销。UINavigationController pushViewController stoppes工作

服务器端注销的想法是这样的,每15秒调用一个函数来检查应用程序是否仍然登录。如果不是这种情况,那么跳转到LoginViewController。

注销也可以从App本身发生。它执行相似的代码。

有三个相关的控制器,LoginViewController是我们想要结束的地方,SignOutController是'注销'按钮所在的位置和MainViewController。

以下是相关的代码部分。

首先,UINavigationController的被allcated这样的:

- (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; 
} 

当“登录out'-按钮被按下或应用程序计算出该服务器具有强制注销,该代码执行(相同的代码,不同势函数):

LoginViewController *loginView = [[LoginViewController alloc]initWithNibName:@"LoginViewController" bundle:nil]; 
[self.navigationController pushViewController:loginView animated:YES]; 
[loginView release]; 

如果它是一个Serverside集团注销它只是重新加载MainViewController,每隔15秒,你看到MainViewController动画滑动它在一个周期去从那里,每15秒重新加载。

如果你点击'Sign out'按钮,它会跳到MainViewController而不是LoginViewController,并启动上面描述的相同的循环。

P.S.我检查了是否有任何importend变量为零,并且我已经检查过initalisation代码是否被实际执行。

编辑:我想我没有提到。我的应用程序99%的时间工作。仅仅有一段时间,这种情况发生,注销按钮不起作用,我开始了这个循环。通常它工作正常。

回答

0

对于新的LoginViewController滑入其中的第15个周期,似乎您并未停下来检查应用程序是否在实现它之后才登录。你应该有某种布尔值来存储它并取消定时器或你使用的任何东西。

我不明白你说什么,当你按下注销按钮,但我不认为你是一个很好的用户界面。

我建议你通过向导航控制器添加loginViewController作为根启动应用程序。然后,您不添加动画即可添加要开始的动画(例如MainViewController)。每当应用程序退出服务时,您都会弹出视图控制器,直到第一个应用程序成为登录控制器。

您对此有方法popToRootViewControllerAnimated:

如果您想保留初始屏幕,您可以将其设置为应用程序的根视图控制器,并在加载完成后将其设置为uiNavigationController。

+0

定时器程序自动采场,当你不MainViewController了。如果NavigationController工作,它不会是一个问题。 当你按下注销按钮,它只是跳转到LoginViewController。我不明白那是不好的用户界面。我只是想建议注销按钮在另一个ViewController上,并且最终在MainView上。 我会测试你的想法。 – nickik 2013-04-06 18:43:54

+0

当我说这是一个糟糕的用户界面是,这是一个有点akward的有登录查看我的意思压入堆栈,因为它滑入。通常登录与您提前到主应用程序的第一个视图,并当你注销你回到他们。 – Erpheus 2013-04-06 21:09:19

0

计时器不会因为您已将视图推到另一个顶部而自动停止。它将一直存在,直到它启动的控制器被释放,这只会在它从堆栈中移除后才会发生。

此外,您无需在每次检查后推MainViewController到堆栈,你会用它的多个实例,每个实例在另一个之上结束。

而且,没有真正知道很多关于应用程序的体系结构,它似乎是一个好主意,使LoginViewController模式,他们真的不能,如果他们还没有右登录做些什么吗?模态显示的视图控制器不会受导航堆栈的影响,并且还会保留用户导航堆栈比手动推/拉控制器容易得多。

+0

请看我的编辑。它实际上大部分时间都在工作,所以定时器实际上停止了,我可以在服务器上看到它,它不会再收到任何消息。每次检查时我都不会推送MainViewController,只有当它不移动到LoginViewController时,我才会得到这个循环问题。 – nickik 2013-04-07 12:00:50

+0

如果出现这种情况,它看起来像是一种竞争条件,计时器会在您按下退出按钮的同时打勾;所以你在之后立即推入LoginViewController,然后是MainViewController?您是否曾尝试在出现这种情况时打印导航堆栈? – user352891 2013-04-07 14:25:42

+0

MMhh,如何打印导航堆栈? – nickik 2013-04-07 15:10:10

相关问题