UINavigationController pushViewController停止工作

时间:2013-04-06 17:37:45

标签: iphone ios objective-c uinavigationcontroller uinavigation

我的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%的时间都有效。偶然发生这种情况,签出按钮不起作用,我开始这个循环。通常它工作正常。

2 个答案:

答案 0 :(得分:0)

对于新的LoginViewController在其中滑动的15秒循环,似乎您没有停下来检查应用程序是否在意识到它之后已登录。你应该有一些布尔值来存储它并取消定时器或你使用的任何东西。

当你按下注销按钮时,我不明白你说的是什么,但我认为你没有做出良好的用户界面。

我建议您通过向导航控制器添加loginViewController作为root来启动应用程序。然后在没有动画的情况下添加您想要开始的那个(例如MainViewController)。每当应用程序从服务中注销时,您都会弹出视图控制器,直到第一个视图控制器为登录控制器。

您可以使用方法popToRootViewControllerAnimated:

如果要保留启动画面,可以将其设置为应用程序的根视图控制器,并在加载完成后将其改为uiNavigationController。

答案 1 :(得分:0)

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

此外,您不需要在每次检查后将MainViewController推入堆栈,最终会有多个实例,每个实例都在另一个上面。

另外,在没有真正了解应用程序架构的情况下,使用LoginViewController模式似乎是一个好主意,如果他们没有登录,他们真的无法做任何事情吗?模块化呈现的视图控制器不会受到导航堆栈的影响,并且还比使用手动推送/弹出控制器更容易保留用户导航堆栈。