带手势识别器和故事板的EXC_BAD_ACCESS

时间:2012-01-19 20:10:47

标签: cocoa ipad storyboard exc-bad-access uigesturerecognizer

我有一个以编程方式创建的Storyboard(因为我只用于iOS 5),它有一个简单的Controller和一个iPad View。我需要一个手势识别器并添加它。但是当App加载并且我变得更加强烈时,我得到了EXC_BAD_ACCESS:

  

*** - [DOiPadStoryboardViewController handleSliding:]:发送到解除分配的实例0x238580的消息

一定是简单的我做错了。为什么控制器被解除分配?

我使用以下代码创建故事板:

if (isIOS5) {
    // iOS 5 with storyboard
    UIViewController *viewControler = nil;
    if([self isiPad]){
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"iPadStoryboard" bundle: [NSBundle mainBundle]];
        viewControler = [storyboard instantiateInitialViewController];
    } else {
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"iPhoneStoryboard" bundle: [NSBundle mainBundle]];
        viewControler = [storyboard instantiateInitialViewController];
    }
    [self.window addSubview:viewControler.view];
} 

手势识别器连接到主视图,IBAction位于视图控制器中。故事板如下所示(但不确定是否添加任何内容): Storyboard

这是Pan Gesture识别器: Gesture properties

最后是'bt'控制台输出:

#0  0x37d2b8a0 in ___forwarding___ ()
#1  0x37c86680 in __forwarding_prep_0___ ()
#2  0x318d2f06 in _UIGestureRecognizerSendActions ()
#3  0x31864c1c in -[UIGestureRecognizer _updateGestureWithEvent:] ()
#4  0x31a90508 in ___UIGestureRecognizerUpdate_block_invoke_0541 ()
#5  0x317dfd68 in _UIGestureRecognizerApplyBlocksToArray ()
#6  0x317de8b6 in _UIGestureRecognizerUpdate ()
#7  0x317eb3cc in _UIGestureRecognizerUpdateGesturesFromSendEvent ()
#8  0x317eb20e in -[UIWindow _sendGesturesForEvent:] ()
#9  0x317eaddc in -[UIWindow sendEvent:] ()
#10 0x317d14ec in -[UIApplication sendEvent:] ()
#11 0x317d0d2c in _UIApplicationHandleEvent ()
#12 0x37a57df2 in PurpleEventCallback ()
#13 0x37cfd552 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#14 0x37cfd4f4 in __CFRunLoopDoSource1 ()
#15 0x37cfc342 in __CFRunLoopRun ()
#16 0x37c7f4dc in CFRunLoopRunSpecific ()
#17 0x37c7f3a4 in CFRunLoopRunInMode ()
#18 0x37a56fcc in GSEventRunModal ()
#19 0x317ff742 in UIApplicationMain ()
#20 0x00003050 in main (argc=1, argv=0x2fdffaa8)

2 个答案:

答案 0 :(得分:2)

将视图控制器设置为窗口的根视图控制器,而不是将其视图添加为子视图 - 由于您从视图控制器层次结构中分离视图层次结构,因此Apple已过时且不鼓励,这反过来最终会导致令人讨厌的错误,例如视图控制器没有获得旋转回调等等。

顺便说一句,你的视图控制器将被窗口保留,不再崩溃。

答案 1 :(得分:1)

只需将viewControler设为(保留)属性即可。您没有在代码示例中保留视图控制器。

在.h文件中创建一个属性:

@property (retain) UIViewController *viewController;

在.m文件中添加:

@synthesize viewController;

同时更改作业:

self.viewControler = [storyboard instantiateInitialViewController];