2015-10-09 2 views
0

Я создаю пользовательский UIControl (MyControl) в раскадровке. на ios 8 и ios 9 все в порядке, и в моем приложении нет сбоев. Но на ios 7 и, например, iphone 4, приложение падает при попытке загрузить контроллер представления, содержащий этот элемент управления. Отладчик выделяет эту строку:UIControl от xib сбоев на ios 7.1

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 

ответ

0

Проверьте ограничения атрибутов и сравните список here. Следующие атрибуты были добавлены в iOS 8 и будут разбиваться на iOS 7 (и ранее), если они ссылаются на xib или в коде.

  • NSLayoutAttributeLastBaseline
  • NSLayoutAttributeFirstBaseline
  • NSLayoutAttributeLeftMargin
  • NSLayoutAttributeRightMargin
  • NSLayoutAttributeTopMargin
  • NSLayoutAttributeBottomMargin
  • NSLayoutAttributeLeadingMargin
  • NSLayoutAttributeTr ailingMargin
  • NSLayoutAttributeCenterXWithinMargins
  • NSLayoutAttributeCenterYWithinMargins
Смежные вопросы