0
- (IBAction)StartGame:(id)sender
{
    MainGameDisplay *secondPage = [[MainGameDisplay alloc] initWithNibName:nil bundle:nil];

    [self.view addSubview:secondPage.view];
    secondPage.view.frame = CGRectMake(568, 0, 568, 320);//(N = horizontal, N = vertical)
    [UIView animateWithDuration:1.0f
                     animations:^{
                         //actual frame needed with an animation.
                         secondPage.view.frame = CGRectMake(0, 0, 568, 320);
                     }
                     completion:^(BOOL finished) {
                         //ENTER HERE ANYTHING TO RUN AFTER ANIMATION IS COMPLETED:
                         [self presentViewController: secondPage animated:NO completion:NULL];
                         //This will make the next page load correctly after the transition, otherwise you cannot. interact with anything.
                     }];
}

これは、ビューに入るのに完全に機能します。がないと、新しいページを操作できず[self presentViewController: secondPage animated:NO completion:NULL];、クリックしたボタンでページがクラッシュします。

最初のページに戻って通常どおりに実行すると問題ありませんが、もう一度 StartGame をクリックすると、プログラムがビューを変更してクラッシュします。問題は行[self.view addSubview:secondPage.view];にあります。これをコメントアウトすると、プログラムはクラッシュしませんが、ビューを変更しても遷移せず、すぐに表示されます。

トランジションは、ランドスケープモードでもかなりラグがあり、グリッチがありますが、ポートレートでは完璧です.

4

3 に答える 3

1

ここではsecondPage、currentViewをサブビューとして追加しています。そして再びあなたはそれを提示します。crash log私はそれがいくつかの記憶関連のことを引き起こしているのは他のことかもしれないと思います(あなたがあなたの質問にいくつかをここに入れればそれは非常に明白でしょう)。ただし、再度提示する必要はないことをお勧めしますsecondPage。ここに、1行の変更を加えたコードを示します。

   - (IBAction)StartGame:(id)sender
      {
      MainGameDisplay *secondPage = [[MainGameDisplay alloc] initWithNibName:nil bundle:nil];



    [self.view addSubview:secondPage.view];
    secondPage.view.frame = CGRectMake(568, 0, 568, 320);//(N = horizontal, N = vertical)
    [UIView animateWithDuration:1.0f
                 animations:^{
                     //actual frame needed with an animation.
                     secondPage.view.frame = CGRectMake(0, 0, 568, 320);
                 }
                 completion:^(BOOL finished) {

                     //ENTER HERE ANYTHING TO RUN AFTER ANIMATION IS COMPLETED:

currentView.soのサブビューとしてsecondPageをすでに追加しているので、sinlgeの下にコメントする必要があります。さらに、再度表示する必要はありません。

                   //  [self presentViewController: secondPage animated:NO completion:NULL];
                     //This will make the next page load correctly after the transition, otherwise you cannot. interact with anything.
                 }];

}

編集:ランドスケープモードの場合、フレームsecondPageビューを設定しているときに座標を変更する必要があります。ここでは、4インチデバイス用にこのビューを作成していると思います。ここでは、いくつかのチェックをこのように設定することでこれを行うことができます

   if(checkIfDeviceIsInlandscae)
    {
       secondPage.view.frame = CGRectMake(568, 0, 568, 320);

    } 

   else 
    {
      secondPage.view.frame = CGRectMake(320, 0, 320, 568);
    }

ブロック内では、animation牽引線の上で行ったように、向きに応じてフレームを変更します。

于 2012-11-08T19:20:42.773 に答える
0

あなたの問題は、メモリの割り当て/割り当て解除の 1 つです。secondPageどこにも保持していないため、StartGameメソッドロジックが完了した後に割り当てが解除されます。この割り当て解除MainGameDisplayにより、 を含む の ivar/プロパティも割り当て解除されますMainGameDisplay.view。これはすべて、表示されたビューを操作する前に発生するため、値を変更したり、存在しないビューを操作したりしようとすると、EXC_BAD_ACCESSエラーでクラッシュします。

本当にView Controllerの外部で管理したい場合MainGameDisplay.viewは、親クラスのivarまたはメンバー変数にsecondPageを保持する必要があります。

ParentClass.m:

@interface ParentClass ()
{
    MainGameDisplay *_secondPage;
}

@end

...

- (IBAction)StartGame:(id)sender
{
    _secondPage = [[MainGameDisplay alloc] initWithNibName:nil bundle:nil];
    [self.view addSubview:_secondPage.view];

    ...

}

ただし、これは一般的に推奨される設計パターンではありません。ビュー、特に行われる可能性のあるレイアウトの変更、表示方法のアニメーションなどを管理するのは、View Controller の責任です。 のカプセル化の責任に違反していますMainGameDisplay。MainGameDisplay 内で必要なビュー管理を行うことを検討する必要があります。

View Controller Programming Guide for iOSを読むことをお勧めします。やろうとしていることの基本と、それを行うためのベスト プラクティスについて説明します。

于 2012-11-11T19:51:28.930 に答える
0

presentViewController:1 つの問題は、両方を呼び出しaddSubview:てビューを 2 回追加することです。それが呼び出され、それを使用して secondPage で UI をフックしているpresentViewController:ため、呼び出す必要があると思われます。viewDidAppear:MainGameDisplay のviewDidAppear:メソッドにログ ステートメントを入れて、いつ呼び出されるかを確認します。

[self presentViewController: secondPage animated:NO completion:NULL]1 つの修正は、単に[secondPage viewDidAppear:NO].

于 2012-11-08T19:28:52.713 に答える