1

アラートビューのようなカスタムログインビューポップアップを作成しようとしています。次の関数を使用してalertviewポップアップをシミュレートしています。この関数は、私のloginViewController.mのviewDidloadにあります。

-(void)initialDelayEnded {
    self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.001, 0.001);
    self.view.alpha = 1.0;
    [UIView animateWithDuration:1.0/1.5 animations:^{
        self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1);
    }completion:^(BOOL complete){
        [UIView animateWithDuration:1.0/2 animations:^{
            self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.9, 0.9);
        }completion:^(BOOL complete){
            [UIView animateWithDuration:1.0/2 animations:^{
                self.view.transform = CGAffineTransformIdentity;
            }];
        }];
    }];
}
- (void)viewDidLoad
{
    [self initialDelayEnded];
    [super viewDidLoad];
}

そして、次の方法でfirstViewControllerをloginViewControllerと呼んでいます。

LoginViewController *login = [[LoginViewController alloc]initWithNibName:@"LoginViewController" bundle:NULL];
        [self presentViewController:login animated:YES completion:NULL];

ただし、次のエラーでクラッシュします。

'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View <UIView: 0x8674bf0; frame = (0 20; 320 460); autoresize = W+H; layer = <CALayer: 0x8670620>> is associated with <LoginViewController: 0x868a7d0>. Clear this association before associating this view with <LoginViewController: 0x8451e70>.

誰かが私を助けることができますか?

前もって感謝します !

4

5 に答える 5

1

ここ:

[self presentViewController:login animated:YES completion:NULL];

viewControllerあなたは私がそれ自体であると思う自己によって提示していviewcontrollerます。

代わりに、以下を使用する必要があります。

[self presentModalViewController:login animated:YES];

viewcontrollerむしろそれをナビゲーションスタックにプッシュして提示したい場合。このコードを使用しているクラス。

于 2012-11-12T11:29:36.993 に答える
0

LoginViewController xibを確認しましたか?同じビューを複数のビューコントローラでマッピングしている可能性はありますか?

于 2012-11-12T11:41:17.430 に答える
0

エラーメッセージは、「LogInViewController」のインスタンスが2つあることを示しています。ストーリーボードを使用していますか?その場合は、View Controllerを(個別のペン先ではなく)メインストーリーボードファイルに追加し、タグ/識別子を付けます(ただし、他のVCには接続しないでください)。次に、ストーリーボードで作成されたインスタンスを取得して提示できます。そのようです:

//Get the stroyboard
UIStoryBoard *mainStoryBoard = [UIStoryBoard storyboardWithName:<STORYBOARD_NAME> bundle:nil];

//Get the VC
LogInViewController *login = [mainStoryBoard instantiateViewControllerWithIdentifier:<VIEWCONTROLLER_TAG>];

//Present
[self presentModalViewController:login animated:YES];

また、で他のViewControllerを表示しようとしないでくださいviewDidLoad:。機能しません。コードを移動して、新しいコントローラーをに表示しますviewDidAppear:

于 2012-11-12T12:43:47.927 に答える
0

特別な理由がない限り[super viewDidLoad];、ローカル実装内でできるだけ早く行われるように電話をかけ続けてください。意味:[self initialDelayEnded];AFTERに電話する[super viewDidLoad];

名前の付いた.xibファイルのパネルにViewControllerオブジェクトがLoginViewController1つだけありFile's Owner、 ViewControllerオブジェクトがないことを確認してください。また、カスタムクラスがであることを確認してください。.xibのスクリーンショットをアップロードしてください。具体的には表示されていますか?何が間違っていたのかを理解するのがはるかに簡単になりますPlaceholdersObjectsFile's OwnerLoginViewControllerDocument Outline

于 2012-11-12T12:37:43.987 に答える
0

次の方法でアプリのログインの問題を解決しました>

  1. アラートビューを使用して、applicationDidBecomeActiveのAppDelegateに表示しました
  2. LoginSubViewという名前のプロジェクトにXIBを使用してUIViewコントローラーを追加します。空白のままにして、99と言うタグを追加しました
  3. 警告ボックスが表示される前にLoginSubViewコントローラーをロードしました。

    AFLoginViewController *LoginSubView = [[AFLoginViewController alloc] init];
    [_window addSubview:LoginSubView.view];
    [_window makeKeyAndVisible];
    
    UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"This is an example alert!" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Login", nil];
    alert.alertViewStyle = UIAlertViewStyleSecureTextInput;
    [alert show];
    
  4. ログインが成功した場合は、次の行を含む他の何かの直前にLoginSubViewを削除しました

    for (UIView *subView in _window.subviews)
    {
        if (subView.tag == 99)
        {
            [subView removeFromSuperview];
        }
    }
    
  5. applicationDidEnterBackgroundにも同じサブビューを追加できます。次回フォアグラウンドに戻ったときに敏感な画面ビューがちらつくのを防ぐため

于 2013-04-08T10:16:17.740 に答える