我有一个以编程方式创建的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位于视图控制器中。故事板如下所示(但不确定是否添加任何内容):
这是Pan Gesture识别器:
最后是'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)
答案 0 :(得分:2)
将视图控制器设置为窗口的根视图控制器,而不是将其视图添加为子视图 - 由于您从视图控制器层次结构中分离视图层次结构,因此Apple已过时且不鼓励,这反过来最终会导致令人讨厌的错误,例如视图控制器没有获得旋转回调等等。
顺便说一句,你的视图控制器将被窗口保留,不再崩溃。
答案 1 :(得分:1)
只需将viewControler设为(保留)属性即可。您没有在代码示例中保留视图控制器。
在.h文件中创建一个属性:
@property (retain) UIViewController *viewController;
在.m文件中添加:
@synthesize viewController;
同时更改作业:
self.viewControler = [storyboard instantiateInitialViewController];