我在我的应用上使用DAKeyboardControll
。
它有一个名为swizzled_addSubview
的方法,并实现如下:
- (void)swizzled_addSubview:(UIView *)subview
{
if (!subview.inputAccessoryView)
{
if ([subview isKindOfClass:[UITextField class]])
{
UITextField *textField = (UITextField *)subview;
if ([textField respondsToSelector:@selector(setInputAccessoryView:)])
{
UIView *nullView = [[UIView alloc] initWithFrame:CGRectZero];
nullView.backgroundColor = [UIColor clearColor];
textField.inputAccessoryView = nullView;
}
}
else if ([subview isKindOfClass:[UITextView class]]) {
UITextView *textView = (UITextView *)subview;
if ([textView respondsToSelector:@selector(setInputAccessoryView:)] && [textView respondsToSelector:@selector(isEditable)] && textView.isEditable)
{
UIView *nullView = [[UIView alloc] initWithFrame:CGRectZero];
nullView.backgroundColor = [UIColor clearColor];
textView.inputAccessoryView = nullView;
}
}
}
[self swizzled_addSubview:subview];
}
问题
最近我的新版本与AutoLayout兼容,我收到一些关于此方法的崩溃,以及它们的原因:
-[UIView(DAKeyboardControl) swizzled_addSubview:]
,
EXC_BAD_ACCESS KERN_PROTECTION_FAILURE at 0x0090dffc
我知道许多电话都出现了这个问题,但为什么它无法正常工作?
此次崩溃只发生了8次用户54次,其中50%有越狱设备,但另一个人有非越狱设备!
答案 0 :(得分:0)
方法调配会在运行时导致问题。我也有同样的异常,为了摆脱这个,我使用了BABFrameObservingInputAccessoryView,这对我来说很好。 https://github.com/brynbodayle/BABFrameObservingInputAccessoryView
答案 1 :(得分:0)
很可能你的方法实际上没有被调整,所以你得到一个递归调用,这显然会崩溃。这是关于调配的棘手问题:它交换了两种方法,因此每次调用addSubview都会调用swizzled_addSubview,而调用swizzled_addSubview实际上会调用addSubview。