来自 xib 的 UIControl 在 ios 7.1 上崩溃
Posted
技术标签:
【中文标题】来自 xib 的 UIControl 在 ios 7.1 上崩溃【英文标题】:UIControl from xib crashes on ios 7.1 【发布时间】:2015-10-09 12:15:03 【问题描述】:我在情节提要中创建了一个自定义 UIControl ( MyControl )。在 ios 8 和 ios 9 上一切都很好,我的应用程序没有崩溃。但是在 ios 7 和例如 iphone 4 上,应用程序在尝试加载包含此控件的视图控制器时崩溃。调试器突出显示这一行:
typeof(self) loadedView = self.viewFromNib;
MyControl.h:
@interface MyControl : ControlFromXib
ControlFromXib.h:
@interface ControlFromXib : UIControl
- (void)commonInit;
@end
ControlFromXib.m:
- (instancetype)viewFromNib
typeof(self) view = [[NSBundle mainBundle] loadNibNamed:self.nibName owner:nil options:nil].firstObject;
return view;
- (NSString *)nibName
return NSStringFromClass([self class]);
- (id)initWithFrame:(CGRect)frame
self = [super initWithFrame:frame];
if (self)
self = self.viewFromNib;
[self commonInit];
self.frame = frame;
return self;
- (id)awakeAfterUsingCoder:(NSCoder *)aDecoder
if (self.subviews.count == 0)
typeof(self) loadedView = self.viewFromNib;
loadedView.frame = self.frame;
loadedView.autoresizingMask = self.autoresizingMask;
loadedView.translatesAutoresizingMaskIntoConstraints = self.translatesAutoresizingMaskIntoConstraints;
for (NSLayoutConstraint *constraint in self.constraints)
id firstItem = constraint.firstItem;
if (firstItem == self)
firstItem = loadedView;
id secondItem = constraint.secondItem;
if (secondItem == self)
secondItem = loadedView;
[loadedView addConstraint:
[NSLayoutConstraint constraintWithItem:firstItem
attribute:constraint.firstAttribute
relatedBy:constraint.relation
toItem:secondItem
attribute:constraint.secondAttribute
multiplier:constraint.multiplier
constant:constraint.constant]];
self = loadedView;
[self commonInit];
return self;
- (void)commonInit
@end
【问题讨论】:
【参考方案1】:检查约束属性并与列表here 进行比较。以下属性是在 iOS 8 中添加的,如果在 xib 或代码中引用,则会在 iOS 7(及更早版本)上崩溃。
NSLayoutAttributeLastBaseline NSLayoutAttributeFirstBaseline NSLayoutAttributeLeftMargin NSLayoutAttributeRightMargin NSLayoutAttributeTopMargin NSLayoutAttributeBottomMargin NSLayoutAttributeLeadingMargin NSLayoutAttributeTrailingMargin NSLayoutAttributeCenterXWithinMargins NSLayoutAttributeCenterYWithinMargins【讨论】:
以上是关于来自 xib 的 UIControl 在 ios 7.1 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章
如何在代码之外使用 Xcode 4 和 iOS 4.3 将属性分配给自定义 UIControl?
Swift - UIControl addTarget 不起作用
如何:在iOS中使用StackView View从XIB自我调整自定义视图
UIControl子类-意外地找到nil,同时隐式展开一个可选值