来自 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,同时隐式展开一个可选值

如何让自定义 UIControl 作为推送操作参与 segue?

iOS:动态创建并分配名称给 UIControl