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

在这里,您正在将secondPagecurrentView 添加为子视图。并再次介绍它。我认为它导致一些与内存相关的事情可能是其他事情(如果你crash log在你的问题中放一些东西会很清楚)。但我建议您无需secondPage再次展示。这是您的代码,我在此处进行了单行更改。

   - (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:

您应该在下面发表评论,因为您已经将 secondPage 添加为 currentView 上的子视图。因此无需再次显示它。

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

}

编辑:对于横向模式,您应该在设置 frame secondPageview 时更改坐标。我认为您正在为 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

一个问题是同时调用两者presentViewController:,并且addSubview:您要添加两次视图。我怀疑您发现有必要调用,presentViewController:因为它会调用viewDidAppear:并且您正在使用它来连接 secondPage 中的 UI。我会在 MainGameDisplay 的viewDidAppear:方法中添加一个日志语句,看看它何时被调用。

一种解决方法可能是仅替换[self presentViewController: secondPage animated:NO completion:NULL][secondPage viewDidAppear:NO].

于 2012-11-08T19:28:52.713 回答
0

您的问题是内存分配/释放之一。您不会secondPage在任何地方保留,因此它将在StartGame方法逻辑完成后被释放。这种解除分配反过来也会解除分配MainGameDisplay的 ivars/属性,包括MainGameDisplay.view. 这一切都将在您开始与显示的视图交互之前发生,因此当您尝试更改值或与不再存在的视图交互时,您将因EXC_BAD_ACCESS错误而崩溃。

如果您真的想MainGameDisplay.view在视图控制器之外进行管理,则需要将 secondPage 保留在父类的 ivar 或成员变量中:

父类.m:

@interface ParentClass ()
{
    MainGameDisplay *_secondPage;
}

@end

...

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

    ...

}

但是,这通常不是推荐的设计模式。视图控制器有责任管理其视图,尤其是可能进行的布局更改、显示方式的动画等。您违反了MainGameDisplay. 您应该考虑在 MainGameDisplay 中执行您需要执行的任何视图管理。

我建议通读iOS 的 View Controller Programming Guide。它将解释您正在尝试做的事情的基本原理,以及做这件事的最佳实践。

于 2012-11-11T19:51:28.930 回答