2012-01-19 18 views
3

我用一个简单的控制器和iPad视图以编程方式创建了Storyboard(因为我只用它用于iOS 5)。我需要一个手势识别器并补充说明。但是,当应用程序加载时,我让gustier我得到EXC_BAD_ACCESS:带手势识别器和故事板的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

,这是泛手势识别器: 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

设置视图控制器成为你的窗口的根视图控制器,而不是将其视图添加为子视图 - 这已被Apple si过时和泄气如果您将视图控制器层次结构中的视图层次结构分开,这反过来最终会导致令人讨厌的错误,例如您的视图控制器未获得旋转回调,等等等等。

顺便说一句,您的视图控制器将会保留在窗口中,不再发生崩溃。

+0

谢谢,这工作! –

+0

我很抱歉你能再解释一次吗?我不太明白你的意思...... –

+0

@ChrisBraunschweiler查看苹果的'UIWindow'类参考文档。寻找'rootViewController'属性。 – Danra

1

只需使viewControler成为一个(保留)属性。您不保留代码示例中的视图控制器。

创建.h文件属性:

@property (retain) UIViewController *viewController; 

在.m文件中加入:

@synthesize viewController; 

也改变了分配:

self.viewControler = [storyboard instantiateInitialViewController]; 
+0

好吧,那么一个愚蠢的问题(我主要是一个Java程序员)当我收到对象时,我该怎么做?当我创建一个随后在代码中拥有的对象时,我通常会这样做。 –

+0

我已经更新了答案。 – diederikh

+0

我认为这样的事情会起作用,但会导致相同的错误。 –