状況: アプリに多数のビュー コントローラーがあり、ナビゲーションまたはモーダル ビュー コントローラーとして表示されます。アプリは、ほぼすべての画面からサーバーと通信します。資格情報の有効期限が切れたときに、ユーザーにログイン画面を表示したいと考えています。画面の現在のビューの上にログイン画面をモーダルとして表示し、ログインが成功するとすぐに閉じたいと思います。どうすればこれを達成できるか本当にわかりません。一部のView Controllerによって画面に表示されるモーダルビューがあり、ログイン画面もモーダルとして表示する必要がある場合、どこからこれを行う必要がありますか。appDelegate でウィンドウの rootViewController を切り替えてみたのですがうまくいかず、いろいろとめちゃめちゃでした。提案をお願いします。
3 に答える
UIViewController
モーダル ビューを表示するのメソッドを確認してくださいpresentViewController:animated:completion:
(iOS 5.0 未満でビルドしていない場合)。
私はあなたの問題を見ます。私の意見では、単純なクラスを作成LoginHandler.h
し、アプリの存続期間中維持するのが最善の方法です。
アプリの起動時に初期化する必要はありません。必要なときに常にこのクラスの同じインスタンスを取得する便利なトリックを実装できます。
// @interface
+(id)sharedHandler;
//@implementation
+(id)sharedHandler {
static id sharedHandler = nil;
if (sharedHandler == nil) {
[sharedHandler = [[LoginHandler alloc] init];
}
return sharedHandler;
}
[LoginHandler sharedHandler]
これで、ユーザーNSUserDefaults
またはと同様に、共有インスタンスを で取得するだけですUIApplication
。
次のようなメソッドを持つことができます
-(BOOL)renewLoginFromViewController:(UIViewController*)controller`;
これは、モデル ビュー コントローラーに次のようなものを提示します。
[controller presentModalViewController:loginScreen];
YES
ログインが成功した場合 (または、ログインが成功する前に消えない場合)を返します。
このクラスからすべてのログイン ロジックを処理できます。これは、カプセル化の良い教科書の例です。
アプリの起動時だけチェックすると良いでしょう。このように、didFinishLaunchWithOptions の AppDelegate.m でこれを行うことをお勧めします。
あなたはそのようなことをすることができます:
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
if (USER_HAS_VALID_CREDENTIALS) {
self.viewController = [[[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil] autorelease];
} else {
self.viewController = [[[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil] autorelease]; // need to get credentials
}
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
ログインに成功したら、必ず LoginViewController から RootViewController を起動してください。