我有一个UITableViewCell
,里面有几个UIImageView
个。我已经为每个人添加了UITapGestureRecognizer
,然后我会将消息发回给拥有的UIViewController
以推送到新的UIViewController
,并将UIImage
传递给数据显示在新推出的UIViewController
。
以下是我用来执行此操作的代码:
- (void)imageViewTappedForImage:(UIImage *)image {
MSSPictureDetailViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"pictureDetailViewController"];
vc.image = image;
[self.navigationController pushViewController:vc animated:YES];
}
我到最后一行就好了,但是我一直得到一个EXC_BAD_ACCESS错误。
vc.image
是一个强大的属性。如果我输入一个断点,我能想到要检查的每个变量都有一个实际值。
有没有人看到我失踪的东西?
更新 我看到的错误信息是EXC_BAD_ACCESS。
这是回溯:
* thread #1: tid = 0x33018e, 0x0287b0b2 libobjc.A.dylib`objc_msgSend + 14, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x77656982)
frame #0: 0x0287b0b2 libobjc.A.dylib`objc_msgSend + 14
frame #1: 0x016649b7 UIKit`-[UINavigationController _startCustomTransition:] + 895
frame #2: 0x016718f7 UIKit`-[UINavigationController _startDeferredTransitionIfNeeded:] + 688
frame #3: 0x016724e9 UIKit`-[UINavigationController __viewWillLayoutSubviews] + 57
frame #4: 0x017b30d1 UIKit`-[UILayoutContainerView layoutSubviews] + 213
frame #5: 0x0159a964 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355
frame #6: 0x0287d82b libobjc.A.dylib`-[NSObject performSelector:withObject:] + 70
frame #7: 0x0078845a QuartzCore`-[CALayer layoutSublayers] + 148
frame #8: 0x0077c244 QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 380
frame #9: 0x0077c0b0 QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 26
frame #10: 0x006e27fa QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 294
frame #11: 0x006e3b85 QuartzCore`CA::Transaction::commit() + 393
frame #12: 0x007a15b0 QuartzCore`+[CATransaction flush] + 52
frame #13: 0x015299bb UIKit`_UIApplicationHandleEventQueue + 13095
frame #14: 0x02ca377f CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
frame #15: 0x02ca310b CoreFoundation`__CFRunLoopDoSources0 + 235
frame #16: 0x02cc01ae CoreFoundation`__CFRunLoopRun + 910
frame #17: 0x02cbf9d3 CoreFoundation`CFRunLoopRunSpecific + 467
frame #18: 0x02cbf7eb CoreFoundation`CFRunLoopRunInMode + 123
frame #19: 0x033d95ee GraphicsServices`GSEventRunModal + 192
frame #20: 0x033d942b GraphicsServices`GSEventRun + 104
frame #21: 0x0152bf9b UIKit`UIApplicationMain + 1225
* frame #22: 0x00029d6d IMR`main(argc=1, argv=0xbfffee58) + 141 at main.m:16
答案 0 :(得分:1)
这个方法imageViewTappedForImage:
是你传递给手势识别器的选择器吗?这可以解释这个问题。 gr传递本身作为该方法的参数,而不是它附加的视图。 gr有它作为一个属性的视图,所以这样修复(如果我的猜测是正确的,这是你的gr。触发的方法)......
- (void)imageViewTappedForImage:(UIGestureRecognizer *)gr {
UIImageView *imageView = (UIImageView *)gr.view;
MSSPictureDetailViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"pictureDetailViewController"];
vc.image = imageView.image;
[self.navigationController pushViewController:vc animated:YES];
}
答案 1 :(得分:0)
我最后尝试了几种不同的方式来调用我的MSSPictureDetailViewController
,所有这些都失败了。
这使我发现我的错误与UITapGestureRecognizers
无关,与哪个帖子调用我的转换无关,与UIImageView
引用无关......等等。
我最终发生的事实是我在我的UIViewController
中有一个自定义方法,声明如下:
- (IBAction)view;
在这一点上,答案对我来说非常明显,但最初并不是这样,所以我要在这里给后人发出警告:
请勿在UIVIEWCONTROLLER中声明一个名为view
的方法!!!
事实证明,每次iOS尝试访问此UIViewController
子类的view属性时,都会调用我的空方法。显然(并且可以理解),这使系统感到困惑,并且它不知道放在屏幕上的内容,因为它永远无法访问它所期望的UIView
对象。
无论如何,改变
- (IBAction)view
到
- (IBAction)viewPicture
解决了一切。
然而,我有点惊讶,那就是压倒一切@property(nonatomic,retain) UIView *view
与
- (IBAction)view
(将返回类型从UIView
更改为void
)没有抛出编译器错误(或至少发出警告)。
答案 2 :(得分:0)
追踪EXC_BAD_ACCESS的最佳方法是从编辑方案菜单启用Zombie Objects。启用后,您应该使用Zombie仪器配置应用程序。现在重现你的bug并查看分配面板。每当检测到僵尸时,就会出现一个红色标记,描述僵尸的位置,并为您提供有关谁负责的有用提示。
现在,您应该真正扩展您的问题,添加更多详细信息,您提供的信息我怀疑我们可以提供更多帮助。