我正在从我的故事板/iOS6/ARC 应用程序中的 xib 加载覆盖视图。这个视图有一个图像视图、文本视图和一些开关。我的问题是,在自定义了一些控件之后,当我试图从视图转换回我的主视图时,我得到了 EXC_BAD_ACCESS。
我通过从我的视图控制器(在button_touchup
函数期间)创建一个实例并调用 UIView来加载视图transitionWithView
。我可以通过填充这些控件的实例函数使用从 VC 传递的数据初始化imageView
and 。text
这很好用,我可以毫无问题地过渡。
当我尝试自定义开关颜色时,问题就出现了 - 例如_toggleSwitch.thumbTintColor = [UIColor colorwithRed.....];
,切换显示为白色,然后在交互期间或视图破坏时(当转换回主视图 / 时self removeFromSuperview
)与 bad_exec 一起崩溃。在使用实例函数转换到视图之前,我已经尝试过这样做,我已经尝试过这样做,-awakeFromNib
但-didMoveToWindow
没有运气。我已经尝试将颜色保存在类的强属性中。唯一有效的是使用内置常量 - 例如_toggleSwitch.thumbTintColor = [UIColor redColor]
。
如何在不崩溃的情况下自定义这些开关的外观?我什至尝试通过覆盖视图的设置函数从我的呈现视图控制器传递自定义 UIColor 对象,就像我将文本textfield.text
和图像传递给imageview.image
一样 - 通过将其分配给self.toggleswitch.thumbTintColor
它仍然会导致错误的执行。如何自定义我的 xib 中的开关?
编辑:好的,我不认为代码具有启发性,但这是覆盖
overlay.h
@property (strong, nonatomic) IBOutlet UISwitch *switchFB;
这在 -awakeFromNib / xib 中的其他任何地方都可以正常工作
Overlay.m
_switchFB.thumbTintColor = [UIColor redColor];
这会导致 exc_bad_access
_switchFB.thumbTintColor = [UIColor colorWithRed:225.0f green:152.0f blue:140.0f alpha:1.0f];
当我尝试转换回超级视图时(或者有时与修改后的切换交互时)抛出异常:
- (IBAction)buttonCancelClick:(id)sender {
[UIView transitionWithView:self.superview
duration:0.5
options:UIViewAnimationOptionTransitionCurlUp
animations:^{
[self removeFromSuperview];
}
completion:nil
];
}
我认为这与对创建的 UIColor 对象的内存访问有关。我在访问传递给 Overlay 以初始化文本和图像视图的对象时没有问题,因此我修改了初始化这些对象的 setup 函数(从 parentVC 调用)以初始化我的开关。这仍然崩溃。
Overlay.h
@property (strong, nonatomic) IBOutlet UITextView *textField;
@property (strong, nonatomic) IBOutlet UIImageView *imageView;
Overlay.m
- (void)setup:(UIImage *)img text:(NSString *)txt color:(UIColor *)col
{
self.switchFB.thumbTintColor = col;
self.textField.text = txt;
self.imageView.image = img;
}
ParentVC.m
OverlayPublish *olay = [[NSBundle mainBundle] loadNibNamed:@"OverlayPublish"owner:self options:nil][0];
[olay setup:[UIImage imageNamed:@"test.png"] text:@"test txt" color:[UIColor colorWithRed:225.0f green:152.0f blue:140.0f alpha:1.0f]];
[UIView transitionWithView:self.view.superview.superview
duration:0.5
options:UIViewAnimationOptionTransitionCurlDown
animations:^{
[self.view.superview.superview addSubview:olay];
}
completion:nil
Edit2:堆栈跟踪 - 我回到 removeFromSuperView。
线程 #1: tid = 0x1c03, 0x01d8209b libobjc.A.dylib`objc_msgSend + 15, 停止原因 = EXC_BAD_ACCESS (code=1, address=0x51019e21)
帧#0:0x01d8209b libobjc.A.dylib`objc_msgSend + 15
帧#1:0x0224d41c CoreFoundation`CFRelease + 108
帧#2:0x02272e54 CoreFoundation`-[__NSArrayM dealloc] + 196
帧#3:0x01d849ff libobjc.A.dylib`-[NSObject release] + 47
帧 #4:0x01d73927 libobjc.A.dylib
ReleaseValue std::for_each<__gnu_cxx::__normal_iterator<objc_references_support::ObjcAssociation*, std::vector<objc_references_support::ObjcAssociation, objc_references_support::ObjcAllocator<objc_references_support::ObjcAssociation> > ,ReleaseValue>(__gnu_cxx::__normal_iterator<objc_references_support::ObjcAssociation*, std::vector<objc_references_support::ObjcAssociation, objc_references_support::ObjcAllocator<objc_references_support::ObjcAssociation> > >, __gnu_cxx::__normal_iterator<objc_references_support::ObjcAssociation*, std::vector<objc_references_support::ObjcAssociation, objc_references_support::ObjcAllocator<objc_references_support::ObjcAssociation> > >, ReleaseValue) + 72 frame #5: 0x01d73632 libobjc.A.dylib
_object_remove_association + 296第 6 帧:0x01d7a7aa libobjc.A.dylib`objc_destructInstance + 60
帧 #7:0x01d7a7cf libobjc.A.dylib`object_dispose + 20
帧 #8: 0x00b2601a UIKit`-[UIImage dealloc] + 217
帧 #9:0x01d849ff libobjc.A.dylib`-[NSObject 发布] + 47
第 10 帧:0x00c0df90 UIKit`-[UIImageView dealloc] + 752
帧 #11: 0x00b4199c UIKit`-[UIView 发布] + 93
帧 #12: 0x00b497fb UIKit`-[UIView(Hierarchy) removeFromSuperview] + 190
帧 #13: 0x00b43ee5 UIKit`-[UIView dealloc] + 375
第 14 帧:0x00d06a01 UIKit`-[_UISwitchInternalView dealloc] + 288
帧 #15: 0x00b4199c UIKit`-[UIView 发布] + 93
框架 #16: 0x00b497fb UIKit`-[UIView(Hierarchy) removeFromSuperview] + 190