0

UINavigationController に問題があります。クライアントまたはサーバー側のログアウトに関するものです。

サーバー側のログアウトのアイデアはこれです。15 秒ごとに、アプリがまだログインしているかどうかを確認する関数が呼び出されます。そうでない場合は、LoginViewController にジャンプします。

ログアウトはアプリ自体から行うこともできます。simular コードを実行します。

関連する 3 つのコントローラーがあります。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];

サーバーサイド ログアウトの場合は、MainViewController をリロードするだけで、15 秒ごとに MainViewController のアニメーションがスライド インします。そこから 1 サイクルで、15 秒ごとにリロードします。

「サインアウト」ボタンをクリックすると、LoginViewController ではなく MainViewController にジャンプし、上記と同じサイクルを開始します。

PS importend 変数が nil かどうかを確認し、初期化コードが実際に実行されることを確認しました。

編集:私はそれについて言及しなかったと思います。私のアプリは 99% の確率で動作します。たまにサインアウトボタンが機能せず、このサイクルが始まります。通常は正常に動作します。

4

2 に答える 2

0

新しいLoginViewControllerがスライドする15秒のサイクルでは、アプリがログインしていないことに気付いた後、ログインしているかどうかを確認するために停止していないようです。それを保存し、タイマーまたは使用するものをキャンセルするには、ある種のブール値が必要です。

ログアウトボタンを押すと何が起こるかわかりませんが、良いユーザーインターフェースを作っているとは思えません。

root として loginViewController をナビゲーション コントローラーに追加して、アプリケーションを起動することをお勧めします。次に、開始したいものをアニメーションなしで追加します (たとえば、MainViewController)。アプリケーションがサービスからログアウトされるたびに、最初のビュー コントローラー (ログイン コントローラー) までポップします。

そのための方法popToRootViewControllerAnimated:があります。

スプラッシュ スクリーンを保持したい場合は、それをアプリのルート ビュー コントローラーとして設定し、読み込みが完了したら uiNavigationController に変更します。

于 2013-04-06T18:00:15.720 に答える
0

ビューを別のビューの上にプッシュしたからといって、タイマーが自動的に停止することはありません。それが開始されたコントローラーが解放されるまでそこにあり、それはスタックから削除された後にのみ発生します。

また、チェックのたびに MainViewController をスタックにプッシュする必要はありません。その複数のインスタンスがそれぞれ別のスタックの上にあることになります。

また、アプリのアーキテクチャについてよく知らなくても、LoginViewController をモーダルにするのは良い考えのように思えますが、正しくログインしていないと本当に何もできないのでしょうか? モーダルに表示されたビューコントローラーは、ナビゲーション スタックの影響を受けず、コントローラーを手動でプッシュ/ポップするよりもはるかに簡単にユーザーのナビゲーション スタックを保持できます。

于 2013-04-06T23:08:52.720 に答える