UIStoryboardSegue导致EXC_BAD_ACCESS第二次崩溃

时间:2012-10-02 20:15:46

标签: iphone objective-c exc-bad-access uistoryboard uistoryboardsegue

我一直在尝试创建一个模仿“Cover Vertical”模态segue的UIStoryboardSegue,但是使视图“Uncover”,以便segues看起来自然。这是我的UIStoryboardSegue子类:

//RetreatVertical.m

#import "RetreatVertical.h"
@implementation RetreatVertical

-(void)perform {
    UIView *oldView = [self.sourceViewController view];
    UIView *newView = [self.destinationViewController view];
    [oldView.window insertSubview:newView belowSubview:oldView];

    [UIView animateWithDuration:0.3 animations:^{
        oldView.center = CGPointMake(oldView.center.x, oldView.center.y + oldView.frame.size.height); }
        completion:^(BOOL finished){ [oldView removeFromSuperview]; }
     ];
}

@end

当用户点击按钮时,UIViewController使用模态segue“Cover Vertical”滑动到焦点。当用户点击新UIViewController上的按钮时,该UIViewController向下滑动,显示旧的UIViewController(使用我的自定义segue“RetreatVertical”)。这一切都运行正常,但是,每当我在两个动画完成后点击任何其他按钮或界面元素时,应用程序都会以“EXC_BAD_ACCESS”崩溃。我不明白为什么,过去一小时的搜索没有提出任何建议。

谢谢!

修改 为什么这个策略不起作用?

- (void) perform {
    UIView *sourceView = [self.sourceViewController view];
    UIView *destView = [self.destinationViewController view];
    [[self.sourceViewController superview] insertSubview:destView belowSubview:sourceView];

    [UIView animateWithDuration:0.3 animations:^{
        sourceView.center = CGPointMake(sourceView.center.x, sourceView.center.y + sourceView.frame.size.height); }
        completion:^(BOOL finished){ [sourceView removeFromSuperview]; }
     ];
}

1 个答案:

答案 0 :(得分:2)

直接使用应用程序窗口(以及它的子视图)总是很棘手,很难做到正确;有很多隐藏的东西正在发生,你可能无法解释。因此,我们只需稍微更改您的层次结构,以使一切变得更轻松。

现在你有:

A =根VC

B =新VC

转换:窗口 { A -----> B }

更好的解决方案:

A =根VC

B =新VC

C =旧VC

转换:窗口{ A { C -----> B }}

这意味着您的Root只是一个普通的VC,其空白视图会将您的视图推到顶部。这样您就可以轻松完成所需的任何动画,而无需担心搞砸主窗口。