2013-04-06 76 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

相關問題