关于用代码实例化对象与xib实例化文件调用方法的不同

相信大部分接触过xib与storyboard的开发者都对俩者描述控件赞不绝口,俩者的出现大大降低了开发者开发的时间,不用在设置UI浪费大量的时间和维护臃肿的代码,本文来说一说用代码实例化对象和xib实例化对象系统调用方法的不同

用代码实例化对象

  • 对于用代码实例化一个控件(CustomView)所需要的代码如下
CustomView *customView = [[CustomView alloc] init];

  • 此时系统会调用对象的init方法,如果开发者需要在对象初始化时给对象的属性赋值就在对象的init方法中写入即可,如下图
   - (instancetype)init
 {
  if (self = [super init]) {
      self.backgroundColor = [UIColor blueColor];
      self.alpha = 0.5f;
      self.shopsLabel.text = @"商品";
  }
  return self;
 }

需要注意如果创建对象是通过initWithFrame方法是不会调用init方法
的,系统会自动调用initWithFrame方法,而通过init方法创建对象也
会调用initWithFrame方法

通过xib加载对象

  • 用xib实例化对象方法需要注意Xib的文件名最好与文件的名字相同
[[[NSBundle mainBundle] loadNibNamed:@"CustomView"
owner:nil options:nil] lastObject];
  • 此时系统会自动调用initWithCoder:aDecoder方法来初始化对象,而此时如果在initWithCoder:方法中设置对象属性
  - (instancetype)initWithCoder:(NSCoder *)aDecoder
{
   if (self = [super initWithCoder:aDecoder]) {
       self.backgroundColor = [UIColor blueColor];
       self.alpha = 0.5f;
       self.shopLabel.text = @"商品";
   }
   return self;
}
  • 此时会发现对内部shopLabel.text设置没有作用。因为对象内部控件还没有实例化(也就是还没有被连线)需要在Xib文件加载完毕后才可以设置,解决方法是在awakeFromNib设置参数属性,如下图
  - (void)awakeFromNib
{
   self.shopLabel.text = @"商品";
}

文章比较短,希望可以帮助到遇到此问题的朋友

你可能感兴趣的:(关于用代码实例化对象与xib实例化文件调用方法的不同)