自定义塞恩后退按钮崩溃应用程序

问题描述:

我已经为我的应用程序编写了一个自定义塞格,它部分遮蔽了源视图控制器。赛格工作正常,我得到了预期的效果。当我按下按钮将segue展开回源控制器时,应用程序崩溃。我用各种方法写了一些日志语句,但没有任何东西被调用,所以我认为我错误地将意见连接起来了。这里的赛格代码:自定义塞恩后退按钮崩溃应用程序

- (void)perform { 
NSLog(@"performing!"); 
UIView *sourceView = ((UIViewController *)self.sourceViewController).view; 
UIView *destView = ((UIViewController *)self.destinationViewController).view; 
UIViewController *sourceController = ((UIViewController *)self.sourceViewController); 

if (!_rewinding) { 
[sourceView.window insertSubview:destView aboveSubview:sourceView]; 
    destView.center = CGPointMake(sourceView.frame.size.width * 1.5, sourceView.center.y); 
} 

CGPoint newSourceCenter = CGPointMake(sourceView.frame.origin.x - sourceView.frame.size.width * 0.4, sourceView.center.y); 
CGPoint newDestCenter = CGPointMake(sourceView.center.x + sourceView.frame.size.width * 0.1, sourceView.center.y); 


[UIView animateWithDuration:1.4 
       animations:^{ 
        if (_rewinding) { 
         NSLog(@"rewind in segu"); 
         destView.center = CGPointMake([UIScreen mainScreen].bounds.size.width/2, destView.center.y); 
         sourceView.center = CGPointMake([UIScreen mainScreen].bounds.size.width*1.5, sourceView.center.y); 
         destView.alpha = 1.0; 
        } else { 
         destView.center = newDestCenter; 
         sourceView.center = newSourceCenter; 
         sourceView.alpha = 0.5; 
        } 
       } completion:^(BOOL finished) { 
        if (_rewinding) 
        NSLog(@"completed animation"); 
       }]; 
} 

一对夫妇的照片,以显示发生了什么。在点击单元格时,详细视图从右侧的屏幕向外滑动,并且源视图幻灯片也向左滑动。

main/source viewafter segue

我使用[source presentViewController:dest]但这样做,试图消除从窗口源视图。由于我部分模糊了源,因此必须在动画之后保留在屏幕上。什么是正确的方法来设置?

编辑: 随着僵尸的启用,我在日志中得到了这个。这对应于destinationViewController。所以很明显它在赛季中没有被保留。

[58880:c07] *** -[UIStoryboardUnwindSegueTemplate performSelector:withObject:withObject:]: message sent to deallocated instance 0x1f3c7fe0 
+0

什么是确切的崩溃?你可以发布符号化的崩溃日志吗? – 2013-04-10 16:58:11

+0

@RoboticCat崩溃可能不是正确的用词。我得到一个EXC_BAD_ACCESS。我正在研究发生的事情。 – brodney 2013-04-10 17:11:03

+0

要清楚:您是说0x1f3c7fe0对应于您打开的前一个视图控制器实例?如果一个视图控制器被释放,我会感到惊讶,但如果是这样的话,我不知道如何寻找这个bug。 – 2013-04-10 17:59:25

我会与我落得这样做回答这个问题,但离开它打开,因为我的方式做到这一点离开屏幕上的原始视图的一部分SEGUE认真感兴趣。

我的快速解决方案是在原始视图控制器中处理所有动画。我认为这涵盖了上述与内存有关的所有问题,但它可能不正确,所以请自担风险使用。

- (void)showModalDetailView { 
NSLog(@"show modal"); 
if (!self.detailViewController) { 
    self.detailViewController = (SegmentDetailViewController *)[[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"segDetail"]; 
    self.detailViewController.view.center = CGPointMake(self.view.frame.size.width * 1.5, self.view.center.y); 
    [self.view.superview addSubview:self.detailViewController.view]; 
    self.detailViewController.delegate = self; 
} 

CGPoint newSourceCenter = CGPointMake(self.view.frame.origin.x - self.view.frame.size.width * 0.4, self.view.center.y); 
CGPoint newDestCenter = CGPointMake(self.view.center.x + self.view.frame.size.width * 0.1, self.view.center.y); 

[UIView animateWithDuration:1.4 
       animations:^{ 
        if (self.shouldRewind) { 
         self.view.center = CGPointMake([UIScreen mainScreen].bounds.size.width/2, self.view.center.y); 
         self.detailViewController.view.center = CGPointMake([UIScreen mainScreen].bounds.size.width*1.5, self.detailViewController.view.center.y); 
         self.view.alpha = 1.0; 
         self.shouldRewind = NO; 
         self.detailViewController = nil; 
        } else { 
         self.detailViewController.view.center = newDestCenter; 
         self.view.center = newSourceCenter; 
         self.view.alpha = 0.5; 
         self.shouldRewind = YES; 
        } 
       } completion:^(BOOL finished) { 
        NSLog(@"animation complete"); 

       }]; 

}