6

私のアプリでは、ログイン画面を表示したいと思います。この画面は、アプリの起動時とアプリのアクティブ化時に表示されます。参考までに、絵コンテ、ARCを使用しており、タブ付きのバーアプリケーションです。

applicationDidBecomeActiveしたがって、私はメソッドでプロセスを実行する必要があります:

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if ( ... ) { // if the user needs to login
        PasswordViewController *passwordView = [[PasswordViewController alloc] init];
        UIViewController *myView = self.window.rootViewController;
        [myView presentModalViewController:passwordView animated:NO];
    }
}

これが機能する範囲でviewDidAppear、アラートビューを表示してユーザーがログインできるようにするメソッドを呼び出すことができます。ただし、これは望ましくないため、ログインテキストボックスやその他のUI要素が必要です。ログインメソッドを呼び出さないと、ラベルやその他の要素をビューに配置しても、何も起こらず、画面は真っ暗になります。

誰かがこれを解決する方法を知っていますか?パスコードビューはナビゲーションコントローラーに埋め込まれていますが、メインストーリーボードから切り離されています。

4

2 に答える 2

7

さまざまな答えがついに私をそれほど複雑に見えない答えに導いたので、ここに投稿します-そして私が正直であるならば、それは実際に本当によく見えます。

まず、パスワードビューがナビゲーションコントローラーに埋め込まれ([エディター]-> [埋め込み])、これはID(私の場合は「loginModal」)を持つモーダルセグエを使用してメインタブバーコントローラーに接続されます。

applicationDidBecomeActiveメソッドに次のようなものを入れます:

[self performSelector:@selector(requestPasscode) withObject:nil afterDelay:0.2f];

そして、この関数をAppDelegateのどこかに配置します

-(void)requestPasscode{
    if ( /* If the user needs to login */ ) {
        [self.window.rootViewController performSegueWithIdentifier:@"loginModal" sender:self];
    }
}

これにより、アプリが開始またはフォアグラウンドに入るたびに(たとえば、アプリを切り替えるときに)ログインビューが表示されます。

注: アプリのルートがナビゲーションコントローラーに埋め込まれている場合、上記の行は機能しません。

ただし、2つのバグがあります。

  1. ユーザーがアプリを閉じたときに以前にモーダルビューを表示していた場合
  2. ユーザーがパスワードビューでアプリを閉じた場合。

これらの両方が原因でアプリがクラッシュするため、applicationWillResignActiveメソッドには次の行が含まれます。

[self.window.rootViewController dismissViewControllerAnimated:NO completion:nil];

基本的に、提示されたすべてのモーダルビューを却下します。これは理想的ではないかもしれませんが、モーダルビューはデータ入力に使用されないことが多いため、多くの場合、これは望ましい効果です。

于 2012-11-26T11:01:27.267 に答える
-1

xib から viewcontrollerを初期 PasswordViewController化するか、UI を Storyboard に保存する場合は、このコントローラーを表示するために Segue を使用する必要があります。

他の部分については言えませんが、その部分はとても奇妙に思えます。

私のパスコード ビューはナビゲーション コントローラーに埋め込まれていますが、メインのストーリーボードから切り離されています。

ストーリーボードでは、View Controller を格納し、View Controller の内部にビューを表示できるため、ViewController の外部にビューを格納することはお勧めできません。これは、メモリ警告を受け取った後にストーリーボードからこのビューをロードできないためです。何を言っているのかわからない場合は、訂正してください。

あなたのやり方で行っている場合、最初に読み込まれたView Controllerから現在のView Controllerを呼び出すため、Storyboardsの最初のView Controllerで負荷PasswordViewControllerに違いはありません。applicationDidBecomeActiveしたがって、最初のView Controllerでそれを行うことができます。また、最初のビューコントローラー内に隠しビューを保存し、ユーザーがログインする必要がある場合にこのビューを表示することもできます。

私はそれをテストしました。したがって、最初にコントローラーがロードされ、次にメソッドが取得されますapplicationDidBecomeActive-(void)viewDidAppear:animatedしたがって、最初のビューコントローラーのメソッド内にコードを配置することをお勧めします。

敬具、 ダニル

于 2012-11-22T16:22:54.697 に答える